Oracle:PL/SQL 游标

一、说明

游标字面理解就是游动的光标。
用数据库语言来描述:游标是映射在结果集中一行数据上的位置实体,有了游标用户就可以访问结果集中的任意一行数据了,将游标放置到某行后,即可对该行数据进行操作,例如提取当前行的数据等等。

二、分类

  • 显式游标
    用CURSOR...IS 命令定义的游标,它可以对查询语句(SELECT)返回的多条记录进行处理。
  • 隐式游标
    是在执行插入(INSERT)、删除(DELETE)、修改(UPDATE)和返回单条记录的查询(SELECT)语句时有PL/SQL自动定义的。

三、属性

Oracle 游标有4个属性: %ISOPEN , %FOUND , %NOTFOUND, %ROWCOUNT

  • %ISOPEN 判断游标是否被打开,如果打开%ISOPEN 等于true,否则等于false
  • %FOUND %NOTFOUND 判断游标所在的行是否有效,如果有效,则%FOUNDD等于true,否则等于false
  • %ROWCOUNT 返回当前位置为止游标读取的记录行数。

四、使用

  • 声明游标
    CURSOR emp_info(vartype number) is select * from emp;
  • 打开游标
    open emp_info;
  • 读取游标
    fetch mycur into varno,varprice;
  • 关闭游标
    close emp_info;

五、显示游标遍历

  1. 方法一
    DECLARE  
      V_EMP_INFO EMP%ROWTYPE;  
      CURSOR EMP_INFO IS  
        SELECT * FROM EMP;   --1、声明游标  
    BEGIN  
      OPEN EMP_INFO;         --2、打开游标,传递参数值    
      LOOP  
        FETCH EMP_INFO INTO V_EMP_INFO;   --3、提取游标fetch into    
        IF EMP_INFO%FOUND THEN  
          DBMS_OUTPUT.PUT_LINE(V_EMP_INFO.ENAME || '的雇佣日期是' ||  
                               V_EMP_INFO.HIREDATE);  
        ELSE  
          DBMS_OUTPUT.PUT_LINE('已经处理完结果集了');  
          EXIT;  
        END IF;  
      END LOOP;  
      CLOSE EMP_INFO;       --4、关闭游标  
    END;
  2. 方法二
    DECLARE  
      V_EMP_INFO EMP%ROWTYPE;  
      CURSOR EMP_INFO IS  
        SELECT * FROM EMP; --1、声明游标  
    BEGIN  
      OPEN EMP_INFO; --2、打开游标,传递参数值    
      LOOP  
        FETCH EMP_INFO INTO V_EMP_INFO; --3、提取游标fetch into  
        EXIT WHEN EMP_INFO%NOTFOUND;  
        DBMS_OUTPUT.PUT_LINE(V_EMP_INFO.ENAME || '的雇佣日期是' ||  
                             V_EMP_INFO.HIREDATE);  
      END LOOP;  
      DBMS_OUTPUT.PUT_LINE('已经处理完结果集了');  
      CLOSE EMP_INFO; --4、关闭游标  
    END;  
  3. 方法三
    DECLARE  
      V_EMP_INFO EMP%ROWTYPE;  
      CURSOR EMP_INFO IS  
        SELECT * FROM EMP; --1、声明游标  
    BEGIN  
      FOR V_EMP_INFO IN EMP_INFO LOOP  
        DBMS_OUTPUT.PUT_LINE(V_EMP_INFO.ENAME || '的雇佣日期是' ||  
                             V_EMP_INFO.HIREDATE);  
      END LOOP;  
      DBMS_OUTPUT.PUT_LINE('已经处理完结果集了');  
    END;  

六、隐式游标处理

DECLARE  
  V_EMP_INFO EMP%ROWTYPE;  
BEGIN  
  SELECT * INTO V_EMP_INFO FROM EMP WHERE ename='SMITH';  
  IF SQL%FOUND THEN  
    DBMS_OUTPUT.PUT_LINE(V_EMP_INFO.ENAME || '的雇佣日期是' ||  
                         V_EMP_INFO.HIREDATE);  
  END IF;  
  DBMS_OUTPUT.PUT_LINE('已经处理完结果集了');  
END;  
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值