176

一部の行を更新する PL/SQL 関数 (Oracle 10g で実行) があります。UPDATE によって影響を受けた行数を調べる方法はありますか? クエリを手動で実行すると、影響を受けた行数がわかるので、PL/SQL でその数を取得したいと考えています。

4

6 に答える 6

275

変数を使用しsql%rowcountます。

影響を受ける行数を見つける必要があるステートメントの直後に呼び出す必要があります。

例えば:

set serveroutput ON; 
DECLARE 
    i NUMBER; 
BEGIN 
    UPDATE employees 
    SET    status = 'fired' 
    WHERE  name LIKE '%Bloggs'; 
    i := SQL%rowcount; 
    --note that assignment has to precede COMMIT
    COMMIT; 
    dbms_output.Put_line(i); 
END; 
于 2009-05-14T07:33:00.433 に答える
31

単純なコマンドからの結果が必要な場合、解決策は次のようになります。

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

基本的な問題は、SQL%ROWCOUNT が PL/SQL 変数 (または関数) であり、SQL コマンドから直接アクセスできないことです。名前のないPL/SQLブロックを使用すると、これを実現できます。

...誰かがSELECTコマンドでそれを使用する解決策を持っているなら、私は興味があります.

于 2014-09-03T07:55:20.800 に答える
7

または、SQL%ROWCOUNT 変数を宣言する必要なく、プロシージャ内でこれを使用できます

于 2012-08-06T14:03:38.410 に答える
1

SQL%ROWCOUNT割り当てなしで使用することもできます (少なくともOracle 11gから)。

現在のブロック内で操作 (更新、削除、または挿入) が実行されていない限り、SQL%ROWCOUNTnull に設定されます。その後、最後の DML 操作の影響を受けた行数のままになります。

テーブル CLIENT があるとします

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
于 2016-09-15T15:18:28.117 に答える
-3

Count(*) 分析関数を使用します OVER PARTITION BY NULL これにより、合計行数がカウントされます

于 2015-05-03T00:50:55.873 に答える