Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

ओरेकल डिलीट स्टेटमेंट:कैस्केड डिलीट द्वारा कितनी पंक्तियों को हटा दिया गया है

जबकि यह 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. पीएल/एसक्यूएल में बूलियन का प्रयोग

  2. Oracle क्वेरी में सशर्त रूप से कॉलम का चयन कैसे करें

  3. Oracle में कई पंक्तियों को जोड़ना और समूहित करना

  4. Oracle (ORA-02270):इस स्तंभ-सूची त्रुटि के लिए कोई अद्वितीय या प्राथमिक कुंजी से मेल नहीं खाता

  5. शालीनता की ओर जाता है:जोखिम वास्तविकता बन जाता है