无法在oracle游标更新中找到更新了多少条记录?

时间:2017-09-16 05:30:50

标签: plsql cursor rowcount

情境: 编写一个PL / SQL块,该块从用户获取一个部门编号,并将属于该部门的所有员工的工资提高10%。该块应在屏幕上显示更新的记录数。

我的计划:

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。

请帮忙。

谢谢,

2 个答案:

答案 0 :(得分:0)

使用简单更新而不是游标+ forall 如果使用FORALL ... UPDATE,则每个循环周期中只更新1条记录,因此UPDATE返回SQL%ROWCOUNT always = 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;
/

答案 1 :(得分: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;