2017-09-16 49 views
1

场景: 编写一个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

请帮助。

感谢,

+0

你可以分享一些示例数据和关联表的模式吗? –

+0

是的。名称空类型 ------ ---- ------------ ENAME VARCHAR2(40) EMPNO NUMBER(7) EMPSAL NUMBER(7) DEPTNO NUMBER(3)数据:xyz,2,10000,1 – Prasann

回答

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

0

使用简单的更新,而不是光标+ 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