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

एपेक्स ओरेकल एसक्यूएल में किसी अन्य तालिका से पंक्ति मान का उपयोग करके तालिका पंक्ति मान पर अद्यतन कैसे ट्रिगर करें?

आप अपने ट्रिगर में :OLD मानों का उपयोग कर रहे हैं जो समस्याग्रस्त लगता है। INSERT पर :OLD मान सभी NULL हैं। तो INSERT के मामले में, कम से कम, ऐसा लगता है कि आप :NEW मानों का उपयोग करना चाहेंगे।

अद्यतन पर :OLD मानों में पूर्व-अद्यतन मान होते हैं। मुझे नहीं पता कि आपकी स्टॉक तालिका को कैसे बनाए रखा जा रहा है, लेकिन मुझे ऐसा लगता है कि आप :OLD मानों को वापस स्टॉक में जोड़ना चाहते हैं, फिर स्टॉक से :NEW मान हटा दें, यह मानते हुए कि ORDER_QUANTITY और STOCK_ID दोनों बदल सकते हैं।

जब आप DELETE कर रहे होते हैं :OLD मानों में पूर्व-विलोपन मान होते हैं, लेकिन :NEW मान सभी NULL होते हैं (समझ में आता है, यदि आप इसके बारे में सोचते हैं)। तो हटाने के मामले में ऐसा लगता है कि आप :OLD मानों का उपयोग करना चाहेंगे। हालांकि, अगर आप किसी पीओ को हटा रहे हैं तो क्या आप वास्तव में स्टॉक को समायोजित करना चाहते हैं? मुझे लगता है कि आपको यह बताने के लिए आदेश पर किसी प्रकार की स्थिति की आवश्यकता होगी कि क्या यह पूरा हो गया है या रद्द कर दिया गया है या जो कुछ भी है, और स्टॉक को केवल थोक स्टॉक तालिका में तभी जोड़ें जब आदेश कभी पूरा नहीं हुआ।

किसी भी स्थिति में, अपने ट्रिगर को फिर से लिखने का एक तरीका यह होगा:

create or replace trigger UPDATE_ON_PURCHASE
  BEFORE insert or update or delete on PURCHASE_ORDER
  for each row
  begin
    IF INSERTING THEN
      UPDATE bulk_stock
        SET BULK_QUANTITY = BULK_QUANTITY - :NEW.ORDER_QUANTITY
        WHERE STOCK_ID = :NEW.STOCK_ID; 
    ELSIF UPDATING THEN
      UPDATE BULK_STOCK
        SET BULK_QUANTITY = BULK_QUANTITY + :OLD.ORDER_QUANTITY
        WHERE STOCK_ID = :OLD.STOCK_ID; 

      UPDATE BULK_STOCK
        SET BULK_QUANTITY = BULK_QUANTITY - :NEW.ORDER_QUANTITY
        WHERE STOCK_ID = :NEW.STOCK_ID; 
    ELSIF DELETING THEN
      UPDATE BULK_STOCK
        SET BULK_QUANTITY = BULK_QUANTITY + :OLD.ORDER_QUANTITY
        WHERE STOCK_ID = :OLD.STOCK_ID;
    END IF;
  end;

मुझे यकीन नहीं है कि यह तर्क वास्तव में वही है जो आप चाहते थे क्योंकि मैं पूरी तरह से समझ नहीं पा रहा हूं कि आप क्या करने की कोशिश कर रहे हैं, विशेष रूप से DELETE मामले में, इसलिए इसे एक उदाहरण के रूप में लें और जो भी तर्क आपकी स्थिति के लिए आवश्यक है उसे लागू करें।

मैं यह भी कहूंगा कि मुझे लगता है कि इस तर्क को ट्रिगर में डालना एक बुरा विकल्प है। इस तरह के व्यावसायिक तर्क को एक ट्रिगर में लागू नहीं किया जाना चाहिए - इसे एक प्रक्रिया में रखना और आवश्यकता होने पर प्रक्रिया को कॉल करना बेहतर है। व्यावसायिक तर्क को ट्रिगर में डालने से समस्या हो सकती है

शुभकामनाएँ।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. इश्यू बिल्डिंग cx_Oracle - libclntsh.so.11.1 => नहीं मिला

  2. बिना किसी पैरामीटर के हल करने की प्रक्रिया

  3. छँटाई के साथ पुनरावर्ती सबक्वेरी

  4. रॉ(16) कॉलम में यूयूआईडी कैसे डालें

  5. HEXTORAW () फ़ंक्शन कैसे काम करता है? एल्गोरिदम क्या है?