標籤:
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.BULK COLLECT的限制
1、不能對使用字串類型作鍵的關聯陣列使用BULK COLLECT 子句。
2、只能在伺服器端的程式中使用BULK COLLECT,如果在用戶端使用,就會產生一個不支援這個特性的錯誤。
3、BULK COLLECT INTO 的目標對象必須是集合類型。
4、複合目標(如物件類型)不能在RETURNING INTO 子句中使用。
5、如果有多個隱式的資料類型轉換的情況存在,多重複合目標就不能在BULK COLLECT INTO 子句中使用。
6、如果有一個隱式的資料類型轉換,複合目標的集合(如物件類型集合)就不能用於BULK COLLECTINTO 子句中。
oracle for loop迴圈以及遊標迴圈