1. for in loop形式
DECLARE
CURSOR c_sal IS SELECT employee_id, first_name || last_name ename, salary
FROM employees ;
BEGIN
--隱含打開游標
FOR v_sal IN c_sal LOOP
--隱含執行一個FETCH語句
DBMS_OUTPUT.PUT_LINE(to_char(v_sal.employee_id)||'---'|| v_sal.ename||'---'||to_char(v_sal.salary)) ;
--隱含監測c_sal%NOTFOUND
END LOOP;
--隱含關閉游標
END;
2.普通的游標循環
declare
--定義游標並且賦值(is 不能和cursor分開使用)
cursor
stus_cur
is
select
*
from
students;
--定義rowtype
cur_stu students%rowtype;
/*開始執行*/
begin
--開啟游標
open
stus_cur;
--loop循環
loop
--循環條件
exit
when
stus_cur%notfound;
--游標值賦值到rowtype
fetch
stus_cur
into
cur_stu;
--輸出
dbms_output.put_line(cur_stu.
name
);
--結束循環
end
loop;
--關閉游標
close
stus_cur;
/*結束執行*/
end
;
3.
高效的游標循環
declare
cursor
myemp_cur
is
select
*
from
myemp;
type myemp_tab
is
table
of
myemp%rowtype;
myemp_rd myemp_tab;
begin
open
myemp_cur;
loop
fetch
myemp_cur bulk collect
into
myemp_rd limit 20;
for
i
in
1..myemp_rd.
count
loop
dbms_output.put_line(
'姓名:'
||myemp_rd(i).ename);
end
loop;
exit
when
myemp_cur%notfound;
end
loop;
end
;
BULK COLLECT 子句會批量檢索結果,即一次性將結果集綁定到一個集合變量中,並從SQL引擎發送到PL/SQL引擎。通常可以在SELECT INTO、
FETCH INTO以及RETURNING INTO子句中使用BULK COLLECT.
FETCH INTO以及RETURNING INTO子句中使用BULK COLLECT.
BULK COLLECT的限制
1、不能對使用字符串類型作鍵的關聯數組使用BULK COLLECT 子句。
2、只能在服務器端的程序中使用BULK COLLECT,如果在客戶端使用,就會產生一個不支持這個特性的錯誤。
3、BULK COLLECT INTO 的目標對象必須是集合類型。
4、復合目標(如對象類型)不能在RETURNING INTO 子句中使用。
5、如果有多個隱式的數據類型轉換的情況存在,多重復合目標就不能在BULK COLLECT INTO 子句中使用。
6、如果有一個隱式的數據類型轉換,復合目標的集合(如對象類型集合)就不能用於BULK COLLECTINTO 子句中。
1、不能對使用字符串類型作鍵的關聯數組使用BULK COLLECT 子句。
2、只能在服務器端的程序中使用BULK COLLECT,如果在客戶端使用,就會產生一個不支持這個特性的錯誤。
3、BULK COLLECT INTO 的目標對象必須是集合類型。
4、復合目標(如對象類型)不能在RETURNING INTO 子句中使用。
5、如果有多個隱式的數據類型轉換的情況存在,多重復合目標就不能在BULK COLLECT INTO 子句中使用。
6、如果有一個隱式的數據類型轉換,復合目標的集合(如對象類型集合)就不能用於BULK COLLECTINTO 子句中。