Plsql 在oracle游标更新中找不到更新了多少记录?

Plsql 在oracle游标更新中找不到更新了多少记录?,plsql,cursor,rowcount,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

场景: 编写一个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_输出保持在循环之外,它会给出0

请帮忙


谢谢,

使用简单的更新,而不是游标+forall。
如果你用FORALL。。。更新,则在每个循环周期中只更新1条记录,因此更新将返回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;
/

使用简单的更新,而不是游标+全称。
如果你用FORALL。。。更新,则在每个循环周期中只更新1条记录,因此更新将返回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;
/

请检查以下脚本:

  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;

请检查以下脚本:

  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;

您能分享一些相关表的示例数据和模式吗?可以。名称空类型------------ENAME VARCHAR2(40)EMPNO编号(7)EMPSAL编号(7)DEPTNO编号(3)数据:xyz,2,10000,1您可以共享一些示例数据和关联表的架构吗?可以。名称空类型------------ENAME VARCHAR2(40)EMPNO编号(7)EMPSAL编号(7)DEPTNO编号(3)数据:xyz,2,10000,1感谢快速解决方案。工作正常。非常感谢您的快速解决方案。它工作得很好。