【问题标题】:Unable to find in oracle cursor update that how many records are updated?在 oracle 游标更新中找不到更新了多少条记录?
【发布时间】:2017-09-16 05:30:49
【问题描述】:

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

请帮忙。

谢谢,

【问题讨论】:

  • 你能分享一些相关的表的示例数据和架构吗?
  • 是的,当然。名称 Null 类型 ------ ---- ------------ ENAME VARCHAR2(40) EMPNO NUMBER(7) EMPSAL NUMBER(7) DEPTNO NUMBER(3) 数据:xyz, 2 , 10000, 1

标签: plsql cursor rowcount


【解决方案1】:

请检查以下脚本:

  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;

【讨论】:

    【解决方案2】:

    使用简单更新而不是游标 + 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;
    /
    

    【讨论】:

    • 非常感谢您的快速解决方案。它工作正常。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-08
    • 1970-01-01
    • 2021-10-16
    • 1970-01-01
    • 2011-03-16
    • 1970-01-01
    • 2016-05-01
    相关资源
    最近更新 更多