when - update sql where select oracle




受PL/SQL中的UPDATE影響的行數 (4)

我有一個PL / SQL函數(在Oracle 10g上運行),其中我更新了一些行。 有沒有辦法找出有多少行受UPDATE影響? 當手動執行查詢時,它告訴我有多少行受到影響,我想在PL / SQL中獲取該數字。


請試試這個..

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

---------------------
begin
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;
end;

---------------------
select * from client;

---------------------
declare
  counter integer := 0;
begin
  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.');
      else
        dbms_output.put_line(sql%rowcount||' client updated for '||val);
        counter := counter + sql%rowcount;
      end if;
  end loop;
   dbms_output.put_line('Number of total lines affected update operation: '||counter);
end;

---------------------
select * from client;

--------------------------------------------------------

結果如下所示:

2客戶更新為1
沒有2個val_cli的客戶端。
沒有3個val_cli的客戶端。
1個客戶更新了4個
沒有5個val_cli的客戶端。
1個客戶更新了6個
沒有7個val_cli的客戶端。
沒有8個val_cli的客戶端。
沒有客戶與9 val_cli。
1個客戶更新為10個
受影響的更新操作總數:5


SQL%ROWCOUNT也可以在不被分配的情況下使用(至少從Oracle 11g )。

只要在當前塊內沒有執行任何操作(更新,刪除或插入), SQL%ROWCOUNT就會設置為空。 然後它保持受最後一次DML操作影響的行數:

說我們有表客戶

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

我們會這樣測試它:

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;

導致:

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

對於那些希望得到明確命令結果的人,解決方案可能是:

begin
  DBMS_OUTPUT.PUT_LINE(TO_Char(SQL%ROWCOUNT)||' rows affected.');
end;

基本問題是SQL%ROWCOUNT是一個PL / SQL變量(或函數),不能直接從SQL命令中訪問。 通過使用非名稱的PL / SQL塊,可以實現這一點。

...如果有人有解決方案在SELECT命令中使用它,我會感興趣。


或者, SQL%ROWCOUNT你可以在程序中使用它,而不需要聲明一個變量





sql-update