PLSQL學(xué)習(xí)(一) 基礎(chǔ)知識
?
??? 很久以前自己整理的PLSQL一些基礎(chǔ)知識,翻出來看看都是比較基礎(chǔ)的內(nèi)容,還是放上來好了。參考的資料是《PL/SQL用戶指南與參考》中譯版,覺得這是一部很不錯的入門書,感謝把這本書翻譯出來的網(wǎng)友。
?
?
1、乘方的不同應(yīng)用:
?
??? 在SQL中乘方只能使用函數(shù)Power(a,b)來計算
??? 但在PLSQL中可直接使用a**b表示
?
2、賦值語句Returning:
?
?? insert
into
t1
values
(
90
,
'SERVICE'
,
'BEIJING'
)
?? Returning
rowid
,
name
into
row_id,info;
??? 注:只限insert、update、delete一條記錄時進(jìn)行賦值
?
3、自定義參數(shù)——&:
?
??? 可SQL和PLSQL中均可使用自定義參數(shù),即需要自己輸入值的參數(shù)
??? select * from ldcom where comcode=&a andname=&b;
??? PLSQL:
??? declare i int := &a;?? n int := &b;
?
4、綁定變量的使用:
?
??? 可使用綁定變量的辦法提高SQL效率
?
??? SQL> variable x number ;
??? SQL> exec :x := 8600 ;
??? SQL> select * from ldcom where comcode= :x ;
??? 注:PLSQL中的declare即隱士綁定,無需再申明
?
??? 可用Print查看綁定變量? SQL> print x;
??? 也可使用查詢? SQL> select :x from dual;
?
??? 實際的簡單應(yīng)用:
???
?
??? variable
x
number
;
?
??? declare
????? v_date
date
;
??? begin
????? for
i
in
?
1
..
10
loop
??? ??? :x := i;
???
???
select
sysdate
+:x
into
v_date
from
dual;
??? ??? dbms_output.put_line(v_date);
???
?
end
loop
;
???
end
;
??? /
?
??? 在execute immediate中的應(yīng)用:
???
?
??? declare
??? v_x t1.num%
type
;
??? begin
??? execute
immediate
'update t1 set num=8888 where id=:a returning num into :b'
??? using
2
returning
into
v_x;
??? dbms_output.put_line(v_x);
??? end
;
??? 注意returning的返回值在動態(tài)SQL中的操作格式
?
5、%TYPE和%ROWTYPE的區(qū)別:
?
??? %TYPE針對某一字段類型(數(shù)組也是單一的類型)
??? %ROWTYPE針對某一整表的類型(游標(biāo)也是整表)
?
6、計數(shù)循環(huán)的逆序法:
?
??? for
i
in
reverse
10
..
100
loop
??? 注意reverse的位置不要記錯
?
7、一般的游標(biāo)使用法:
?
??? 1、游標(biāo)的正常使用需要四步
?
??? ①定義游標(biāo)
??? cursor
c2(dept_no
number
default
10
)
is----注意定義dept_no的方法
??? select
name
,agentcode
from
laagent
where
rownum <= dept_no;
??? ②打開游標(biāo)
??? open
c3(dept_no =>
20
);
----
可以重新定義
dept_no
??? ③提取游標(biāo)數(shù)據(jù)
??? fetch
c2
into
dept_name,dept_loc;
----
字符類型、個數(shù)相等
??? fetch
c3
into
deptrec;
----deptrec
為
rowtype
??? exit
when
c3%
notfound
;
??? ④關(guān)閉游標(biāo)
??? CLOSE
c3;
??? ⑤游標(biāo)屬性
??? %
FOUND
?????
--
布爾型屬性,當(dāng)最近一次讀記錄時成功返回
,
則值為
TRUE
;
??? %
NOTFOUND
??
--
布爾型屬性,與
%FOUND
相反;
??? %
ISOPEN
????
--
布爾型屬性,當(dāng)游標(biāo)已打開時返回
TRUE
;
??? %
ROWCOUNT
??
--
數(shù)字型屬性,返回已從游標(biāo)中讀取的記錄數(shù)。
?
??? 2、
使用for自動打開、提取、關(guān)閉游標(biāo)
?
??? FOR
c1_rec
IN
c1
LOOP
??? FOR
c1_rec
IN
(
SELECT
dname, loc
FROM
dept)
LOOP
?
??? 3、注:單一的SQL語句都是一個隱式的游標(biāo),屬性為
?
??? SQL%
FOUND
?????
--
布爾型屬性,當(dāng)最近一次讀記錄時成功返回
,
則值為
TRUE
;
??? SQL%
NOTFOUND
??
--
布爾型屬性,與
%FOUND
相反;
??? SQL%
ISOPEN
????
--
布爾型屬性,當(dāng)游標(biāo)已打開時返回
TRUE
;
??? SQL%
ROWCOUNT
??
--
數(shù)字型屬性,返回已從游標(biāo)中讀取的記錄數(shù)。
??? 例如:DELETEFROM emp WHERE deptno=v_deptno;
????? ??
IF
SQL
%
NOTFOUND
THEN ...
?
8、For Update鎖定數(shù)據(jù):
?
??? CURSOR
emp_cursor
is
select
empno,sal
??? from
emp
where
deptno=v_deptno
for
update
of
sal
nowait
;
??? 注意:其中的of sal,for update可以精確到某一個或幾個字段
?
??? 在使用了For Update之后可以在delete和update語句中使用current of cursor_name子句
??? for
emp_record
in
emp_cursor
loop
?
??? if
emp_record.sal <
1500
then
?????
?
update
emp
set
sal=
1500
where
current
of
emp_cursor;
?
??? end
if
;
??? end
loop
;
??? 但需注意:只能針對for update的表進(jìn)行修改。
?
9、Package中的子程序可以重載
?
??? 即函數(shù)名相同,參數(shù)個數(shù)不同
?
10、PL/SQL的執(zhí)行順序
?
??? 在同一Package中,若要使用自身定義的Function或Procedure,則必須是之前定義過的。
??? 同理,即便使用參數(shù),也必須在前面定義過。
??? 也就是說:一般最終的執(zhí)行程序,會放在Package的最后,除非將所有部分都申明成Public。
?
?