游标参与循环的三种情况:
(1)declare cursor-->open cursor-->loop--->fetch curosr into -->end loop-->close cursor
这种情况每次调用fetch后游标将移动到下一条记录,但是我们要自己构造循环
declare
v_name tdz.vxm%TYPE;--%TYPE可以直接用取出字段的类型
v_class tdz.vbj%TYPE;
v_classes tdz.vbj%TYPE;
cursor mycoursor IS
SELECT vxm.vbj FROM tdz WHERE vbj=v_classes;
BEGIN
v_classes:='tang';
---------------------------
open mycoursor;
------------------------
loop
fetch mycursor into v_name,v_class
exit when mycursor%NOTFOUND;
end loop;
---------------------------------
close mycursor;
--------------------------------
end;
(2)CURSOR FOR Loop
FOR employee_rec in c1 ---employee_rec直接用,不用提前定义
LOOP
total_val := total_val + employee_rec.monthly_income;
END LOOP;
当使用CURSOR FOR Loop时,不用我手工open cursor close cursor,
(3)将dulk collect 批处理加入cursor,fetch语句一次只从结果集中提取出一行,而每次fetch后游标才会
指向结果集的下一行。
//先要定义表,因为游标批处理将返回多条记录,我们把 它存在表中,标的类型与字段的类型一样。
TYPE Tab_sal IS TABLE OF emp.salary&%TYPE;
TYPE Tab_id IS TABLE OF emp.id%TYPE; //emp.id(表名.字段名)
TYPE Tab_name IS TABLE OF emp.name%TYPE;
eid Tab_id ; / /定义好了表后就可以用它来定义变量来存储有标中的相应字段
ename Tab_name;
sales Tab_sal;
cursor my_curl is
select emp_id,emp_name,salary from emp where ROWNUM<=3;(ROWNUM为伪列,表示当前行)
BEGIN
-----------------------------------------------------------------------------
OPEN my_curl;
FETCH my_curl BULK COLLECT INTO eid,ename,sal;
----------------------------------------------------------------------------------
for i IN 1..eid.COUNT loop --i可以直接用
DBMS_OUTPUT.PUT_LINE(ename(i));--用了批处理后,可以像用数组一样
end loop;
---------------------------------------------------------------
close my_curl;
------------------------------------------------------
end;
(可能不设ROWCOUNT之前my_curl将返回更多的纪录,但是可以用ROWCOUNT来限制)
另外,还可以用LIMIT在FETCH语句中限制。
FETCH my_curl BULK COLLECT INTO eid,ename,sal limit 3 (也可以限制在游标记录中只取一定数量的记录数)