无法在oracle游标更新中找到有多少记录被更新?
问题描述:
场景: 编写一个PL/SQL块,它从用户处获取部门编号,并将属于该部门的所有雇员的工资提高10%。该块应该在屏幕上显示有多少记录被更新。无法在oracle游标更新中找到有多少记录被更新?
我的计划:
DECLARE
V_TOT_ROWS NUMBER(3);
CURSOR emp_cursor IS
SELECT EMPSAL FROM emp WHERE deptno=&DEPT_NO
FOR UPDATE OF EMPSAL NOWAIT;
BEGIN
FOR emp_record IN emp_cursor
LOOP
UPDATE emp
SET EMPSAL=EMPSAL+emp_record.EMPSAL*0.1
WHERE CURRENT OF emp_cursor;
-- V_TOT_ROWS := SQL%ROWCOUNT;
-- DBMS_OUTPUT.PUT_LINE('TOTAL UPDATED RECORDS: ' || V_TOT_ROWS);
DBMS_OUTPUT.PUT_LINE('Updated ' || SQL%ROWCOUNT || ' salaries.');
END LOOP;
COMMIT;
-- DBMS_OUTPUT.PUT_LINE('Updated ' || SQL%ROWCOUNT || ' salaries.');
END;
这是给1行更新每次执行循环时间,但如果我把DBMS_OUTPUT外循环,它给0
请帮助。
感谢,
答
请检查下面的脚本:
declare V_TOT_ROWS NUMBER(3) :=0;
CURSOR emp_cursor IS
SELECT EMPSAL FROM emp WHERE deptno=&DEPT_NO
FOR UPDATE OF EMPSAL NOWAIT;
begin FOR emp_record IN emp_cursor
LOOP
UPDATE emp
SET EMPSAL=EMPSAL+emp_record.EMPSAL*0.1
WHERE CURRENT OF emp_cursor;
V_TOT_ROWS := V_TOT_ROWS+SQL%ROWCOUNT;
-- DBMS_OUTPUT.PUT_LINE('TOTAL UPDATED RECORDS: ' || V_TOT_ROWS);
-- DBMS_OUTPUT.PUT_LINE('Updated ' || SQL%ROWCOUNT || ' salaries.');
END LOOP;
COMMIT;
DBMS_OUTPUT.PUT_LINE('Updated ' || V_TOT_ROWS || ' salaries.'); end;
+0
**感谢Ganesh!它按预期工作。** – Prasann
答
使用简单的更新,而不是光标+ FORALL。
如果使用FORALL ... UPDATE,那么只有1记录在每个循环周期更新,所以UPDATE返回SQL%ROWCOUNT总是= 1
DECLARE
V_TOT_ROWS NUMBER(3);
BEGIN
UPDATE emp
SET EMPSAL= EMPSAL+ EMPSAL*0.1
WHERE deptno=&DEPT_NO;
V_TOT_ROWS := SQL%ROWCOUNT;
DBMS_OUTPUT.PUT_LINE('TOTAL UPDATED RECORDS: ' || V_TOT_ROWS);
COMMIT;
END;
/
+0
**非常感谢您的快速解决方案。它工作正常。** – Prasann
你可以分享一些示例数据和关联表的模式吗? –
是的。名称空类型 ------ ---- ------------ ENAME VARCHAR2(40) EMPNO NUMBER(7) EMPSAL NUMBER(7) DEPTNO NUMBER(3)数据:xyz,2,10000,1 – Prasann