存储过程DIY2----游标与循环

本文详细介绍了数据库中游标与循环的三种使用方式:传统声明-打开-循环-关闭方式,CURSOR FOR Loop简化操作,以及DULK COLLECT批处理结合游标的高效利用。通过实例展示了如何在存储过程中灵活运用游标处理数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

游标参与循环的三种情况:
(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 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 (也可以限制在游标记录中只取一定数量的记录数)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值