zoukankan      html  css  js  c++  java
  • ORACLE的显式游标与隐式游标

    1)查询返回单行记录时→隐式游标;

    2)查询返回多行记录并逐行进行处理时→显式游标

    显式游标例子:

    DECLARE
      CURSOR CUR_EMP IS
        SELECT * FROM EMP;
      ROW_EMP CUR_EMP%ROWTYPE;
    BEGIN
      OPEN CUR_EMP;
      FETCH CUR_EMP
        INTO ROW_EMP;
      WHILE CUR_EMP%FOUND LOOP
        DBMS_OUTPUT.PUT_LINE(ROW_EMP.EMPNO || '----' || ROW_EMP.ENAME);
        FETCH CUR_EMP
          INTO ROW_EMP;
      END LOOP;
      CLOSE CUR_EMP;
    END;

    执行结果看窗口中的Output

    --使用显式游标修改数据(给所有的部门经理加薪1000)

    DECLARE
      CURSOR EMP_CUR IS
        SELECT EMPNO, ENAME, SAL FROM EMP WHERE JOB = 'MANAGER' FOR UPDATE;
      EMP_ROW EMP_CUR%ROWTYPE;
    BEGIN
      OPEN EMP_CUR;
      LOOP
        FETCH EMP_CUR
          INTO EMP_ROW;
        IF EMP_CUR%NOTFOUND THEN
          EXIT;
        ELSE
          UPDATE EMP SET SAL = SAL + 1000 WHERE CURRENT OF EMP_CUR;
        END IF;
      END LOOP;
      COMMIT;
      CLOSE EMP_CUR;
    END;

    注意:

    1、如果游标打开之前或关闭之后,使用游标属性,Oracle会抛出一个INVALID_CURSOR错误(ORA-01001);

    2、如果在第一次fetch后结果集是空的,%found=false,%NotFound=true,%ROWCOUNT=0;

    3、如果使用了BULK COLLECT,那么%ROWCOUNT的值可能不是0或1,实际上他返回的是提取到相关集合的行数。

    DECLARE
      CURSOR EMP_CUR IS
        SELECT EMPNO, ENAME, SAL FROM EMP WHERE JOB = 'MANAGER' FOR UPDATE;
    BEGIN
      FOR EMP_ROW IN EMP_CUR LOOP
        UPDATE EMP SET SAL = SAL - 1000 WHERE CURRENT OF EMP_CUR;
      END LOOP;
      COMMIT;
    END;

    --游标for循环(给所有的部门经理减薪1000

    DECLARE
      CURSOR EMP_CUR IS
        SELECT * FROM EMP FOR UPDATE;
    BEGIN
      FOR EMP_ROW IN EMP_CUR LOOP
        IF EMP_ROW.JOB = 'MANAGER' THEN
          UPDATE EMP SET SAL = SAL + 5000 WHERE CURRENT OF EMP_CUR;
        ELSE
          UPDATE EMP SET SAL = SAL + 1000 WHERE CURRENT OF EMP_CUR;
        END IF;
      END LOOP;
    END;

        游标FOR循环确实很好的简化了游标的开发,我们不再需要 open、fetch和close语句,不再需要用  %FOUND  属性检测是否到最后一条记录,这一切Oracle隐式的帮我们完成了。

  • 相关阅读:
    ps4 如何导出切片 单个图片
    测试webservice的时候,如果出现这个错误:"The test form is only available for requests from the local machine"
    js jquery 按钮点击后 60秒之后才能点击 60秒倒计时
    有空研究一下 superwebsocket (底层是 supersocket) 用来实现 web聊天什么的
    Vue学习笔记一:初识Vue
    被爬虫了,嘻嘻嘻
    Mybatis-generator自动生成器
    SpringCloud笔记五:Feign
    SpringCloud笔记四:Ribbon
    SpringCloud笔记三:Eureka服务注册与发现
  • 原文地址:https://www.cnblogs.com/yhoralce/p/7887382.html
Copyright © 2011-2022 走看看