oracleforloop循环以及游标循环
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(ployee_id)||'---'|| ame||'---'||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);oracle游标的使用
--结束循环
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 unt 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 ⼦句中。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论