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

एक पीएल/एसक्यूएल पंक्ति ट्रिगर कैसे बनाएं जो किसी अन्य तालिका से कॉलम को मान्य करता है

आपके ट्रिगर के साथ कई समस्याएं हैं। आइए एक चुनिंदा स्टेटमेंट और शेष कोड के बीच 'रिलेशनशिप' से शुरुआत करें। इस विशेष मामले में select.. और if...end_if (फिलहाल मान लें कि आपका चयन वास्तव में काम करता है, यह सिर्फ मान नहीं लेता है)। अब WHERE क्लॉज पर ध्यान दें।

SELECT SUPPLIER.TRUSTED_SUPPLIER
    INTO TRUST
    ...
    WHERE SUPPLIER.TRUSTED_SUPPLIER = 'YES';

IF TRUST = 'NO' THEN ...

चूंकि आपका चयन केवल हाँ लौटाता है, यदि कथन कभी सत्य नहीं होगा। इसलिए आवेदन अपवाद कभी नहीं उठाया जा सकता है। अब, select . के साथ क्या समस्याएं हैं? .
सबसे पहले आप उस तालिका तक पहुंच रहे हैं जिस पर ट्रिगर सक्रिय है। हालांकि कुछ मामलों में आप इससे बच सकते हैं लेकिन आमतौर पर इसका परिणाम ORA होता है -04091:तालिका बदल रही है, ट्रिगर/फ़ंक्शन इसे नहीं देख सकता है . ट्रिगरिंग टेबल को पूरी तरह से संदर्भित करने से हमेशा बचना चाहिए। आप तालिका डेटा को :NEW और/या :OLD छद्म रिकॉर्ड के साथ संदर्भित करते हैं। दूसरे, आपकी क्वेरी वह नहीं कर रही है जो आपको लगता है कि यह है। यह कहता है

हालांकि INTO क्लॉज के लिए स्टेटमेंट को बिल्कुल 1 पंक्ति return लौटाने की आवश्यकता होती है . अधिक से अधिक 1 पंक्ति का परिणाम अपवाद होता है, और 0 पंक्तियों के परिणामस्वरूप no data found अपवाद।
आखिरकार, raise_application_error statement के साथ एक समस्या है . यदि इसे क्रियान्वित किया गया तो यह एक संख्या तर्क ... सीमा से बाहर है . उठाएगा अपवाद। पहला पैरामीटर -20999 से -20000 (नकारात्मक संख्या) के बीच होना चाहिए। तो परिणाम कैसा दिखता है:

create or replace trigger verify_supplier_trust
before insert or update on product
for each row 
declare 
    trust varchar2(3);

begin
    select supplier.trusted_supplier
      into trust
      from supplier 
     where supplier.company_name = :new.supplier_name
       and supplier.trusted_supplier = 'YES';
exception
   when no_data_found then 
        raise_application_error(-20001, 'supplier not trusted');
end;
/

नोट:
डेटा प्रकार VARCHAR का उपयोग न करें। इसकी अनुमति है लेकिन ओरेकल इसके खिलाफ सिफारिश करता है। इसका मतलब है कि वे किसी भी समय जो कुछ भी करते हैं उसे बदलने का अधिकार सुरक्षित रखते हैं। इसके बजाय अनुशंसित VARCHAR2 का प्रयोग करें।
मैं इन्सर्ट या अपडेट पर ट्रिगर को सक्रिय करने के लिए बदलता हूं। यदि केवल इंसर्ट पर निकाल दिया जाता है तो कोई गैर-विश्वसनीय आपूर्तिकर्ता को संदर्भित करने के लिए सप्लायर_नाम बदल सकता है और सब ठीक रहेगा।



  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 में 1970 UTC के बाद से मिली टाइमस्टैम्प कैसे प्राप्त करें?

  2. Oracle में टाइप 2 SCD को लागू करना

  3. भौतिकीकृत दृश्य HAVING क्लॉज के साथ तेजी से ताज़ा करें?

  4. पैच नीति

  5. Oracle Sql चेक बाधा!=अन्य तालिका