⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cursor_update_lock.txt

📁 orale培训教材包括了所有的sql说明和实例
💻 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 + -