Number of rows affected by an UPDATE in PL/SQL

后端 未结 6 593
暖寄归人
暖寄归人 2020-11-28 22:05

I have a PL/SQL function (running on Oracle 10g) in which I update some rows. Is there a way to find out how many rows were affected by the UPDATE? When executing the query

6条回答
  •  無奈伤痛
    2020-11-28 23:01

    SQL%ROWCOUNT can also be used without being assigned (at least from Oracle 11g).

    As long as no operation (updates, deletes or inserts) has been performed within the current block, SQL%ROWCOUNT is set to null. Then it stays with the number of line affected by the last DML operation:

    say we have table CLIENT

    create table client (
      val_cli integer
     ,status varchar2(10)
    )
    /
    

    We would test it this way:

    begin
      dbms_output.put_line('Value when entering the block:'||sql%rowcount);
    
      insert into client 
                select 1, 'void' from dual
      union all select 4, 'void' from dual
      union all select 1, 'void' from dual
      union all select 6, 'void' from dual
      union all select 10, 'void' from dual;  
      dbms_output.put_line('Number of lines affected by previous DML operation:'||sql%rowcount);
    
      for val in 1..10
        loop
          update client set status = 'updated' where val_cli = val;
          if sql%rowcount = 0 then
            dbms_output.put_line('no client with '||val||' val_cli.');
          elsif sql%rowcount = 1 then
            dbms_output.put_line(sql%rowcount||' client updated for '||val);
          else -- >1
            dbms_output.put_line(sql%rowcount||' clients updated for '||val);
          end if;
      end loop;  
    end;
    

    Resulting in:

    Value when entering the block:
    Number of lines affected by previous DML operation:5
    2 clients updated for 1
    no client with 2 val_cli.
    no client with 3 val_cli.
    1 client updated for 4
    no client with 5 val_cli.
    1 client updated for 6
    no client with 7 val_cli.
    no client with 8 val_cli.
    no client with 9 val_cli.
    1 client updated for 10
    

提交回复
热议问题