https://blog.csdn.net/akkzhjj/article/details/45397423html
- declare
- --定義類型
- cursor t_tea
- is
- select USER_ID from T_TEACHING GROUP BY USER_ID;
- --定義一個遊標變量
- t_row t_tea%rowtype;
- --定義一個number類型的臨時變量
- v_count number;
- begin
- for t_row in t_tea loop
- select count(*) into v_count from T_TEACHING where USER_ID=t_row.USER_ID and COURSE_ID=02;
- if v_count = 0 then
- insert into T_TEACHING(COURSE_ID,USER_ID) values (02,t_row.USER_ID);
- end if;
- end loop;
- end;
oracle for loop循環以及遊標循環
1. for in loop形式sql
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的限制 一、不能對使用字符串類型做鍵的關聯數組使用BULK COLLECT 子句。 二、只能在服務器端的程序中使用BULK COLLECT,若是在客戶端使用,就會產生一個不支持這個特性的錯誤。 三、BULK COLLECT INTO 的目標對象必須是集合類型。 四、複合目標(如對象類型)不能在RETURNING INTO 子句中使用。 五、若是有多個隱式的數據類型轉換的狀況存在,多重複合目標就不能在BULK COLLECT INTO 子句中使用。 六、若是有一個隱式的數據類型轉換,複合目標的集合(如對象類型集合)就不能用於BULK COLLECTINTO 子句中。