1. 遊標: 容器,存儲SQL語句影響行數。
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
2. 遊標類型: 隱式遊標,顯示遊標,REF遊標。其中,隱式遊標和顯示遊標屬於靜態遊標(運行前將遊標與SQL語句關聯),REF遊標屬於動態遊標(運行時將遊標與SQL語句關聯)。
3. 隱式遊標: DML語句對應的遊標,由Oracle自動管理,也稱SQL遊標。
q 隱式遊標的屬性有:
q %FOUND – SQL 語句影響了一行或多行時爲 TRUE
q %NOTFOUND – SQL 語句沒有影響任何行時爲TRUE
q %ROWCOUNT – SQL 語句影響的行數
q %ISOPEN - 遊標是否打開,始終爲FALSE
舉例說明:
declare
v_empno emp.empno %type:=7000;
begin
update emp set ename='fxe' where empno=v_empno;
if SQl%found then
dbms_output.put_line(SQL%rowcount||'Delete Ok!');
end if;
if SQL%notfound then
dbms_output.put_line('僱員編號'||v_empno||'不存在');
end if;
end;
--------------------執行結果如下--------------------------
4. 顯示遊標操作:
(1)聲明遊標(關聯SQL語句) cursor+遊標名 is/as sql語句
(2)打開遊標(執行SQL語句,填充遊標) open+遊標名
(3)提取遊標的行 fetch 遊標名 into 行類型變量
(4)關閉遊標 close+遊標名
舉例說明:
declare
cursor emp_cur is select * from emp;
empRecord emp%rowtype;
begin
open emp_cur;
loop
fetch emp_cur into empRecord;
exit when emp_cur%notfound;
dbms_output.put_line(empRecord.ename);
end loop;
close emp_cur;
end;
-----------------------------------執行結果如下圖--------------------------------------------------------
5帶參數的顯示遊標
例:
declare
destination varchar2(20);
cursor emp_cur(dest varchar2)
is select * from emp where empno=dest;
empRecord emp%rowtype;
begin
destination:=&empno;
open emp_cur(destination);
loop
fetch emp_cur into empRecord;
exit when emp_cur%notfound;
dbms_output.put_line(empRecord.ename);
end loop;
close emp_cur;
end;
----輸入參數:7369
-----------------------------------------執行結果--------------------------------------------------
6.使用顯示遊標更新行
q 允許使用遊標刪除或更新活動集中的行
q 聲明遊標時必須使用 SELECT … FOR UPDATE語句
例:
declare
old_sal number(4);
emp_name varchar2(20);
cursor emp_cur is select ename,sal from emp
where sal<1000
for update of sal;
begin
open emp_cur;
loop
fetch emp_cur into emp_name,old_sal;
exit when emp_cur%notfound;
update emp set sal=1.1*old_sal
where current of emp_cur;
dbms_output.put_line('更新成功!');
end loop;
end;
--------------------------執行結果---------------------------------------
7.循環遊標
q 循環遊標用於簡化遊標處理代碼
q 當用戶需要從遊標中提取所有記錄時使用
q 循環遊標的語法如下:
FOR <record_index> IN <cursor_name>
<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />LOOP
<executable statements>
END LOOP;
例:
declare
cursor emp_cur is select empno,ename,sal from emp;
begin
for empRecord in emp_cur
loop
dbms_output.put_line(empRecord.empno
||empRecord.ename||empRecord.sal);
end loop;
end;
--------------------執行結果--------------------------------
8.REF遊標和遊標變量
q REF 遊標和遊標變量用於處理運行時動態執行的 SQL 查詢
q 創建遊標變量需要兩個步驟:
q 聲明 REF 遊標類型
q 聲明 REF 遊標類型的變量
q 用於聲明 REF 遊標類型的語法爲:
TYPE <ref_cursor_name> IS REF CURSOR
[RETURN <return_type>];
q 打開遊標變量的語法如下:
OPEN cursor_name FOR select_statement;
聲明強類型的REF遊標
type emp_cur is ref cursor return emp%rowtype;
empRecord emp_cur;
聲明弱類型的REF遊標
type emp_cur is ref cursor;
empRecord emp_cur;
例:
DECLARE
TYPE emp_cur IS REF CURSOR
RETURN emp%ROWTYPE;
empObj emp_cur;
empRecord emp%ROWTYPE;
BEGIN
OPEN empObj FOR
SELECT * FROM emp;
loop
FETCH empObj INTO empRecord;
exit when empObj%notfound;
dbms_output.put_line(empRecord.ename);
end loop;
CLOSE empObj;
END;
--------------------------------------執行結果---------------------------------------
9.遊標變量的優點和限制
q 遊標變量的功能強大,可以簡化數據處理。
q 遊標變量的優點有:
q 可從不同的 SELECT 語句中提取結果集
q 可以作爲過程的參數進行傳遞
q 可以進行賦值運算
q 使用遊標變量的限制:
q 不能在程序包中聲明遊標變量
q FOR UPDATE子句不能與遊標變量一起使用
q 不能使用比較運算符