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

Oracle DBMS - AFTER ट्रिगर - परिवर्तनशील तालिका में अद्यतन करने से पहले एक तालिका पढ़ें

बस स्पष्ट करने के लिए, परिवर्तनशील तालिका अपवाद फेंक दिया गया है क्योंकि आप rooms से पढ़ने का प्रयास कर रहे हैं आपके फ़ंक्शन में तालिका, इसलिए नहीं कि आप properties . से पढ़ने का प्रयास कर रहे हैं मेज़। चूंकि आपके पास rooms . पर एक पंक्ति-स्तरीय ट्रिगर है , इसका मतलब है कि rooms जब पंक्ति-स्तरीय ट्रिगर सक्रिय हो रहा हो और यह असंगत स्थिति में हो, तब तालिका परिवर्तन के बीच में होती है। Oracle आपको rooms . से पूछताछ करने से रोकता है उस स्थिति में तालिका क्योंकि परिणाम आवश्यक रूप से नियतात्मक या प्रतिलिपि प्रस्तुत करने योग्य नहीं हैं।

अगर आपने एक स्टेटमेंट-लेवल ट्रिगर बनाया है (FOR EACH ROW . को हटाकर) ) और अपना तर्क वहां रखें, अब आपको एक परिवर्तनशील तालिका अपवाद का सामना नहीं करना पड़ेगा क्योंकि rooms तालिका अब असंगत स्थिति में नहीं होगी। एक कथन-स्तरीय ट्रिगर, हालांकि, यह देखने में सक्षम नहीं है कि कौन सी पंक्ति (पंक्तियों) को संशोधित किया गया था। इसका मतलब यह होगा कि आपको यह देखने के लिए सभी संपत्तियों को देखना होगा कि कौन से स्थिति मानों को समायोजित किया जाना चाहिए। यह विशेष रूप से कुशल नहीं होगा।

अतिरिक्त जटिलता की कीमत पर, आप पंक्ति-स्तरीय ट्रिगर में कौन-से गुण बदल गए हैं और फिर कथन-स्तरीय ट्रिगर में इसका संदर्भ देकर प्रदर्शन में सुधार कर सकते हैं। इसके लिए आम तौर पर तीन ट्रिगर और एक पैकेज की आवश्यकता होती है, जो स्पष्ट रूप से चलने वाले टुकड़ों की संख्या को काफी हद तक बढ़ाता है (यदि आप 11.2 पर हैं, तो आप तीन घटक ट्रिगर्स के साथ एक कंपाउंड ट्रिगर का उपयोग कर सकते हैं जो पैकेज का उपयोग करने की आवश्यकता को समाप्त करके चीजों को थोड़ा सा सरल बनाता है) . यह कुछ इस तरह दिखेगा

CREATE OR REPLACE PACKAGE trigger_collections
AS
  TYPE modified_property_tbl IS TABLE OF properties.property_id%type;
  g_modified_properties modified_property_tbl;
END;

-- Initialize the collection in a before statement trigger just in case
-- there were values there from a prior run
CREATE OR REPLACE TRIGGER trg_initialize_mod_prop_coll
  BEFORE INSERT OR UPDATE ON rooms
BEGIN
  trigger_collections.g_modified_properties := trigger_collections.modified_property_tbl();
END;

-- Put the property_id of the modified row in the collection
CREATE OR REPLACE TRIGGER trg_populate_mod_prop_coll
  AFTER INSERT OR UPDATE ON rooms
  FOR EACH ROW
BEGIN
  trigger_collections.g_modified_properties.extend();
  trigger_collections.g_modified_properties( trigger_collections.g_modified_properties.count + 1 ) := :new.property_id;
END;

CREATE OR REPLACE TRIGGER trg_process_mod_prop_coll
  AFTER INSERT OR UPDATE ON rooms
BEGIN
  FOR p IN 1 .. trigger_collections.g_modified_properties.count
  LOOP
    IF prop_vacancy_query( trigger_collections.g_modified_properties(i) ) = 0 
    THEN
      ...
END;



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle SQL का उपयोग करके दी गई श्रेणी में जन्मदिन वाले कर्मचारियों का चयन करना

  2. जावा से पीएल/एसक्यूएल में सरणी कैसे वापस करें?

  3. परिणाम सेट का अंतिम रिकॉर्ड प्राप्त करें

  4. ओरेकल में, सिंटैक्स के संबंध में - मैं (+) सिंटैक्स को आधुनिक पारंपरिक जॉइन में कैसे परिवर्तित करूं?

  5. Oracle sql एकल कॉलम में विभिन्न मानों के उदाहरणों की गणना करने के लिए