暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

PL/SQL的隐式游标

全栈精英 2021-08-23
1367

(本文使用的是Oracle19c和Scott表 参考:PL/SQL的流程控制

什么是隐式游标

显式游标主要是用于多条记录查询语句的处理

隐式游标是对非查询语句,如修改、删除、添加操作

隐式游标由Oracle隐含创建和自动完成,不用手动定义、打开、取值及关闭

隐式游标的属性

 属性        SELECT    INSERT    UPDATE    DELETE  
 SQL%ISOPEN  
 FALSE    FALSE    FALSE    FALSE  
 SQL%FOUND    TRUE    有结果  
 成功    成功  
 SQL%FOUND    FALSE    没结果  
 失败    失败  
 SQL%NOTFUOND    TRUE    没结果  
 失败    失败  
 SQL%NOTFOUND    FALSE    有结果  
 成功    失败  
 SQL%ROWCOUNT  
 返回行数,只为1    插入的行数    修改的行数    删除的行数  

例:通过隐式游标SQL的%ROWCOUNT属性来了解修改了多少条员工的工资记录 

    DECLARE
    -- 声明变量:记录修改的数量
    v_rows NUMBER;
    BEGIN
    --更新员工工资
    UPDATE emp SET sal = 30000
    WHERE deptno = 10 AND job = 'MANAGER';
    --获取默认游标的属性值
    v_rows := SQL%ROWCOUNT;
    DBMS_OUTPUT.PUT_LINE('更新了'||v_rows||'个雇员的工资');
    -- 提交
    COMMIT;
    END;

    使用游标更新和删除数据

    指在游标打开的情况下,修改或删除表中指定的数据行

    要求游标查询语句中必须使用FOR UPDATE

    与隐式游标不同的是:它要声明游标,并且通过游标的查询语句执行更新和删除,而不是直接执行UPDATE或DELETE

    格式:

     SELECT 列名 FROM 表名 FOR UPDATE [OF 更新的列1[, 更新的列2]…] [NOWAIT]
     -- FOR UPDATE 选项是:在打开游标时锁定游标结果集合在表中对应数据行的所有列和部分列。迫使ORACLE锁定游标结果集合的行,防止别的事务处理更新或删除相同的行,直到本事务处理提交或回退为止。
     -- NOWAIT 选项是:如果另一个事务已对查询的结果集中的行加了锁,那么SELECT FOR UPDATE操作一直等待到别的事务释放这些锁后才继续自己的操作,对于这种情况,当加上NOWAIT子句时,则会立即给出ORA-0054的提示

    注意:使用 FOR UPDATE 声明游标,则可在DELETE和UPDATE 语句中使用WHERE CURRENT OF 游标名,修改或删除游标结果集合当前行对应的数据库表中的数据行

    例:从emp表中查询某部门的员工情况,将其工资最低定为 1500(使用游标更新写法) 

      DECLARE 
      -- 声明游标(使用的游标更新写法)
      CURSOR emp_cursor
      IS
      SELECT empno, sal FROM emp WHERE deptno=10
      FOR UPDATE NOWAIT;
      BEGIN
      -- for 循环
      FOR emp_rec IN emp_cursor LOOP
      -- 判断游标查询结果集工资值是否小于1500
      IF emp_rec.sal < 1500 THEN
      -- 利用游标执行修改,将游标查询结果集的所有sal列的值设置为1500
      UPDATE employees SET sal=1500
      WHERE CURRENT OF emp_cursor;
      END IF;
      END LOOP;
      -- 提交
      COMMIT;
      END;
       
      文章转载自全栈精英,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

      评论