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

उत्परिवर्तित तालिकाओं के समाधान के रूप में Oracle

Oracle उत्परिवर्तित ट्रिगर त्रुटि तब होती है जब कोई ट्रिगर उस तालिका को संदर्भित करता है जो ट्रिगर का मालिक होता है, जिसके परिणामस्वरूप "ORA-04091:तालिका का नाम बदल रहा है, ट्रिगर/फ़ंक्शन इसे नहीं देख सकता है" संदेश।

आइए मौजूदा समाधान पर एक नजर डालते हैं।

पैकेज के माध्यम से पहला, प्राचीन है और प्रभावी प्रतीत होता है, हालांकि, इसे तैयार करने और चलाने में काफी समय लगता है। दूसरा सरल है और यौगिक ट्रिगर का उपयोग करके किया जाता है।

create table turtles 
as
select 'Splinter' name, 'Rat' essence from dual union all
select 'Leonardo', 'Painter' from dual union all
select 'Rafael', 'Painter' from dual union all
select 'Michelangelo', 'Painter'  from dual union all
select 'Donatello', 'Painter'  from dual;

जब स्प्लिंटर चूहे से सेंसेई में बदल जाता है, तो चित्रकारों को स्वचालित रूप से निंजा में बदलना होगा। यह ट्रिगर उपयुक्त प्रतीत होता है:

create or replace trigger tr_turtles_bue
before update of essence
on turtles
for each row
when (
  new.name = 'Splinter' and old.essence = 'Rat' and new.essence = 'Sensei'
)
begin
  update turtles
     set essence = 'Ninja'
   where essence = 'Painter';  
end;

हालांकि, रिकॉर्ड अपडेट करते समय:

update turtles
   set essence = 'Sensei'
 where name = 'Splinter'

निम्न त्रुटि होती है:

ORA-04091:तालिका SCOTT.TURTLES उत्परिवर्तित हो रही है, ट्रिगर/फ़ंक्शन इसे नहीं देख सकता है

आइए इस ट्रिगर को हटा दें:

drop trigger tr_turtles_bue;

विधि 1: पैकेज और निर्देश-स्तरीय ट्रिगर का उपयोग करना।

create or replace package pkg_around_mutation 
is
  bUpdPainters boolean;
  procedure update_painters;  
end pkg_around_mutation;
/

create or replace package body pkg_around_mutation
is
  procedure update_painters
  is
  begin   
    if bUpdPainters then
      bUpdPainters := false;
      update turtles
         set essence = 'Ninja'
       where essence = 'Painter';
    end if;
  end;  
end pkg_around_mutation;
/

create or replace trigger tr_turtles_bue
before update of essence
on turtles
for each row
when (
  new.name = 'Splinter' and old.essence = 'Rat' and new.essence = 'Sensei' 
)
begin
  pkg_around_mutation.bUpdPainters := true;  
end tr_turtles_bue; 
/

create or replace trigger tr_turtles_bu
after update
on turtles
begin
  pkg_around_mutation.update_painters;  
end tr_turtles_bu;
/

विधि 2: कंपाउंड डीएमएल ट्रिगर्स का उपयोग करना (Oracle 11g से शुरू होकर उपलब्ध)।

create or replace trigger tr_turtles_ue
  for update of essence
  on turtles
  compound trigger
    bUpdPainters  boolean;
 
  before each row is
  begin
    if :new.name = 'Splinter' and :old.essence = 'Rat' and :new.essence = 'Sensei' then
      bUpdPainters := true;
    end if;
  end before each row;
  
  after statement is
  begin
    if bUpdPainters then
      update Turtles
         set essence = 'Ninja'
       where essence = 'Painter';
    end if;
  end after statement;
end tr_turtles_ue;

आइए निम्नलिखित प्रयास करें:

update turtles
   set essence = 'Sensei'
 where name = 'Splinter'

यहां तक ​​​​कि अगर आपको उत्परिवर्तन के अधिक जटिल मामले का सामना करना पड़ा है, तो आप उपर्युक्त विचार को समाधान के रूप में उपयोग कर सकते हैं। निर्देश-स्तरीय ट्रिगर में, पंक्ति-स्तरीय ट्रिगर के विपरीत, कोई उत्परिवर्तन नहीं होता है। आप अतिरिक्त पैकेज में या तो वैरिएबल (टैग, लैच, पीएल एसक्यूएल टेबल) का उपयोग कर सकते हैं, या वे वैरिएबल जो कंपाउंड ट्रिगर के सभी सेक्शन के लिए ग्लोबल हैं, जो कि ओरेकल 11 जी के संस्करण से शुरू होने के लिए बेहतर है। तो, अब आप कुंग फू भी जानते हैं।

आपको ट्रिगर्स के बारे में अतिरिक्त जानकारी यहां मिल सकती है:कंपाउंड डीएमएल ट्रिगर्स

कोई भी टिप्पणी जोड़ने के लिए स्वतंत्र महसूस करें।


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. JSON_OBJECTAGG () Oracle में फ़ंक्शन

  2. Oracle डाटाबेस में PL/SQL एक्सेप्शन हैंडलिंग का परिचय

  3. टाइपओआरएम सबक्वेरी

  4. जांचें कि क्या वर्तमान तिथि दो तिथियों के बीच है Oracle SQL

  5. संग्रह विधि:Oracle डेटाबेस में पहले और अगले कार्य