जब आप तालिका को मैन्युअल रूप से अपडेट करते हैं तो ट्रिगर आपकी अपेक्षा के अनुरूप काम करता है।
जब प्रक्रिया से कॉल किया जाता है तो ट्रिगर एक अमान्य राशि की रिपोर्ट नहीं करता है, और भुगतान की गई पूरी राशि दिखाता है, भले ही वह नहीं थी - भुगतान राशि नहीं बदली है लेकिन अन्य कॉलम हैं।
ऐसा इसलिए है क्योंकि आपकी प्रक्रिया का अद्यतन विवरण है:
UPDATE Payment
SET paymenttype = PAYMENT_TYPE,
paymentdate = TO_CHAR(sysdate,'DD/MON/YYYY'),
paymentstatus = v_paymentstatus
where paymentid = PAYMENT_ID;
आप इसे राशि अपडेट करने के लिए नहीं कह रहे हैं, इसलिए ट्रिगर में कोई संशोधित :new
नहीं है मूल्य - पुराने और नए समान हैं। आपको उस कॉलम को अपडेट में शामिल करना होगा:
UPDATE Payment
SET paymenttype = PAYMENT_TYPE,
paymentdate = TO_CHAR(sysdate,'DD/MON/YYYY'),
paymentamount = amt_pay,
paymentstatus = v_paymentstatus
where paymentid = PAYMENT_ID;
TO_CHAR(sysdate,'DD/MON/YYYY')
अजीब लग रहा है - तालिका कॉलम एक तारीख होना चाहिए न कि एक स्ट्रिंग, इसलिए आपको उस मान को एक स्ट्रिंग में परिवर्तित नहीं करना चाहिए; यदि कॉलम एक तारीख है तो आप इसे वापस बदलने के लिए क्लाइंट की एनएलएस सेटिंग्स पर भरोसा कर रहे हैं। यदि आप वर्तमान समय को अनदेखा करने का प्रयास कर रहे हैं तो आप TRUNC(sysdate)
कर सकते हैं इसके बजाय।
आपको dbms_output
. पर भी भरोसा नहीं करना चाहिए प्रक्रिया निकाय में - आप यह नियंत्रित नहीं कर सकते हैं कि इसे कॉल करने वाले व्यक्ति के पास आउटपुट सक्षम है या नहीं, इसलिए उन्हें कभी कोई समस्या नहीं दिखाई दे सकती है। जैसा कि आप ट्रिगर में एक अपवाद उठा रहे हैं, आप अन्य त्रुटियों के लिए प्रक्रिया में भी ऐसा ही कर सकते हैं।