आपके ट्रिगर के साथ कई समस्याएं हैं। आइए एक चुनिंदा स्टेटमेंट और शेष कोड के बीच 'रिलेशनशिप' से शुरुआत करें। इस विशेष मामले में select..
और if...end_if
(फिलहाल मान लें कि आपका चयन वास्तव में काम करता है, यह सिर्फ मान नहीं लेता है)। अब WHERE क्लॉज पर ध्यान दें।
SELECT SUPPLIER.TRUSTED_SUPPLIER
INTO TRUST
...
WHERE SUPPLIER.TRUSTED_SUPPLIER = 'YES';
IF TRUST = 'NO' THEN ...
चूंकि आपका चयन केवल हाँ लौटाता है, यदि कथन कभी सत्य नहीं होगा। इसलिए आवेदन अपवाद कभी नहीं उठाया जा सकता है। अब, select
. के साथ क्या समस्याएं हैं? .
सबसे पहले आप उस तालिका तक पहुंच रहे हैं जिस पर ट्रिगर सक्रिय है। हालांकि कुछ मामलों में आप इससे बच सकते हैं लेकिन आमतौर पर इसका परिणाम ORA होता है -04091:तालिका
हालांकि 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 का प्रयोग करें।
मैं इन्सर्ट या अपडेट पर ट्रिगर को सक्रिय करने के लिए बदलता हूं। यदि केवल इंसर्ट पर निकाल दिया जाता है तो कोई गैर-विश्वसनीय आपूर्तिकर्ता को संदर्भित करने के लिए सप्लायर_नाम बदल सकता है और सब ठीक रहेगा।