2017-09-16 50 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