EMP表在SCOTT用户下。用SCOTT/TIGER登录。
创建EMP表的副本:
CREATE TABLE EMP1 AS SELECT * FROM EMP;
创建更新游标,用来更新EMP1:
DECLARE
CURSOR C_UPDATE IS SELECT EMPNO, ENAME, JOB, SAL FROM EMP1 FOR UPDATE OF SAL;
V_ROW C_UPDATE%ROWTYPE;
V_SAL EMP1.SAL%TYPE;
BEGIN
FOR V_ROW IN C_UPDATE LOOP
IF V_ROW.SAL < 1500 THEN
V_SAL := V_ROW.SAL * 1.2;
ELSIF V_ROW.SAL < 2000 THEN
V_SAL := V_ROW.SAL * 1.5;
ELSIF V_ROW.SAL < 3000 THEN
V_SAL := V_ROW.SAL * 2;
END IF;
UPDATE EMP1 SET SAL=V_SAL WHERE CURRENT OF C_UPDATE;
END LOOP;
COMMIT;
END;
更新前:
更新后:
下面转自:http://blog.csdn.net/yanleigis/article/details/2950208
1、UPDATE语句仅更新在游标声明的FOR UPDATE子句处列出的列。如果没有列出任何列,那么所有的列都可以更新。
2、示例中的COMMIT是在提取循环完成以后才完成的,因为COMMIT将释放由该会话持有的所有锁。因为FOR UPDATE子句获得了锁,所以COMMIT将释放这些锁。当锁释放了,该游标就无效了。所以后继的提取操作都将返回ORACLE错误。