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




