Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Tuyên bố xóa Oracle:có bao nhiêu hàng đã bị xóa bằng cách xóa theo tầng

trong khi điều này là không thể với sql% rowcount, điều này có thể xảy ra nếu bạn viết mã kích hoạt, nhưng điều này có nghĩa là bạn cần một trình kích hoạt trên tất cả các bảng bạn muốn theo dõi. Ngoài ra, trình kích hoạt sẽ làm chậm hoạt động một chút.

ví dụ:

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

chúng tôi muốn một thông số gói để chứa một mảng bảng + số:

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.

chúng tôi muốn một trình kích hoạt trên bảng cấp cao nhất để đặt lại các số đếm này về 0:

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.

điều này giả định rằng bạn chỉ quan tâm đến mảng có xóa khỏi bảng cấp cao nhất. nếu không, bạn muốn kích hoạt trên mỗi bảng với foo.t_rowcount.delete('TABLE_NAME') thay vào đó.

bây giờ là sau cho mỗi trình kích hoạt hàng trên mỗi bảng quan tâm để đặt các mảng:

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.

bây giờ khi chúng tôi xóa hoặc bất cứ điều gì:

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. chuyển đổi yyyy-mm-dd thành mm / dd / yyyy

  2. oracle SQL cộng với cách kết thúc lệnh trong tệp SQL?

  3. PL / SQL sử dụng VARRAY trong IN CLAUSE

  4. Oracle:Truy vấn SQL trả về các hàng chỉ có giá trị số

  5. Chèn ngày vào cơ sở dữ liệu oracle từ PHP