sql >> データベース >  >> RDS >> Oracle

Oracle Deleteステートメント:カスケード削除によって削除された行数

    これはsql%rowcountでは不可能ですが、トリガーコードを記述すれば可能ですが、これは、監視するすべてのテーブルでトリガーが必要であることを意味します。また、トリガーを使用すると、操作が少し遅くなります。

    例:

    SQL> select * from one;
    
            ID
    ----------
             1
             2
    
    SQL> select * from child_of_one;
    
            ID       O_ID
    ---------- ----------
             1          1
             2          1
             3          1
             4          2
             5          2
             6          2
             7          2
             8          2
    

    パッケージ仕様にテーブルとカウントの配列を保持する必要があります:

    SQL> create or replace package foo
      2  as
      3    type rowcount_tab is table of pls_integer index by varchar2(30);
      4    t_rowcount rowcount_tab;
      5  end foo;
      6  /
    
    Package created.
    

    トップレベルテーブルのトリガーでこれらのカウントをゼロにリセットする必要があります:

    SQL> create or replace trigger one_biud
      2  before insert or update or delete
      3  on one
      4  declare
      5  begin
      6    foo.t_rowcount.delete;
      7  end;
      8  /
    
    Trigger created.
    

    これは、最上位のテーブルから削除された配列にのみ関心があることを前提としています。そうでない場合は、foo.t_rowcount.delete('TABLE_NAME')を使用して各テーブルでトリガーが必要です。 代わりに。

    配列を設定するために、対象の各テーブルの各行トリガーのアフター:

    SQL> create or replace trigger one_aiudfer
      2  after insert or update or delete
      3  on one
      4  for each row
      5  declare
      6  begin
      7    if (foo.t_rowcount.exists('ONE'))
      8    then
      9      foo.t_rowcount('ONE') := nvl(foo.t_rowcount('ONE'), 0)+1;
     10    else
     11      foo.t_rowcount('ONE') := 1;
     12    end if;
     13  end;
     14  /
    
    Trigger created.
    
    SQL> create or replace trigger child_of_one_aiudfer
      2  after insert or update or delete
      3  on child_of_one
      4  for each row
      5  declare
      6  begin
      7    if (foo.t_rowcount.exists('CHILD_OF_ONE'))
      8    then
      9      foo.t_rowcount('CHILD_OF_ONE') := nvl(foo.t_rowcount('CHILD_OF_ONE'), 0)+1;
     10    else
     11      foo.t_rowcount('CHILD_OF_ONE') := 1;
     12    end if;
     13  end;
     14  /
    
    Trigger created.
    

    削除するときなど:

    SQL> delete from one where id = 1;
    
    1 row deleted.
    
    SQL> declare
      2    v_table varchar2(30);
      3  begin
      4    v_table := foo.t_rowcount.first;
      5    loop
      6       exit when v_table is null;
      7             dbms_output.put_line(v_table || ' ' || foo.t_rowcount(v_table) || ' rows');
      8             v_table := foo.t_rowcount.next(v_table);
      9     end loop;
     10  end;
     11  /
    CHILD_OF_ONE 3 rows
    ONE 1 rows
    
    PL/SQL procedure successfully completed.
    
    SQL> delete from one where id = 2;
    
    1 row deleted.
    
    SQL> declare
      2    v_table varchar2(30);
      3  begin
      4    v_table := foo.t_rowcount.first;
      5    loop
      6       exit when v_table is null;
      7             dbms_output.put_line(v_table || ' ' || foo.t_rowcount(v_table) || ' rows');
      8             v_table := foo.t_rowcount.next(v_table);
      9     end loop;
     10  end;
     11  /
    CHILD_OF_ONE 5 rows
    ONE 1 rows
    



    1. 生成されたSQLでYiiに特定のエイリアスを使用させることはできますか?

    2. Pythonから繰り返されるMySQLクエリは、同じデータを返します

    3. PHPとMySQLを使用してユーザーの画像を保存するための最良の方法は何ですか?

    4. MariaDB:カスタムデータディレクトリ:常に/ var / lib/mysqlディレクトリを保持する必要があります