📄 cursor_update_lock.txt
字号:
--CURSOR UPDATE LOCK
---------------lock------------------------------------------------------
--插入数据
insert into emp (empno,ename,comm)
values(99,'99',99);
--使用 for update 建立行级lock.对!=99的纪录上锁。
DECLARE
CURSOR c1 IS SELECT empno,sal
FROM emp
where empno!=99
FOR UPDATE;
--对99号以外的
--comm备注为空的纪录更新。
v_comm NUMBER(10,2);
BEGIN
FOR r1 IN c1 LOOP
IF r1.sal <500 THEN
v_comm :=r1.sal *0.25;
ELSIF r1.sal <1000 THEN
v_comm :=r1.sal *0.20;
ELSIF r1.sal <3000 THEN
v_comm :=r1.sal *0.15;
ELSE
v_comm :=r1.sal *0.12;
END IF;
/*UPDATE USE WHERE CURRENT OF CLAUSE:
用WHERE CURRENT OF更新emp的对应纪录*/
UPDATE emp
SET comm =v_comm
--在comm列中天入对应工资的25%,20%,15%,12%
WHERE CURRENT OF c1;
END LOOP;
END;
--ok!注意:因为未在执行此plsql块后commit/rollback,另一个sqlplus中执行
--“update emp set ename='00' where empno=7369;”等,被lock
--FOR UPDATE OF comm;时在另一个sqlplus中,update不在of 句中的字段
--for UPDATE OF comm一旦lock就lock整条纪录,而不是仅lock OF comm中指定的字段。
--ename未在for UPDATE OF comm中,也不在cursor选定的结果集内,仍不可以dml.
--因为一旦lock就lock整条纪录
update emp set ename='00' where empno=7369;
--locked
update emp set comm=100 where empno=7369;
--更新不在cursor对应集中的纪录
update emp set comm=100 where empno=99;
--已更新 1 行
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -