ओरेकल ट्रिगर्स एक और टेबल पर अपडेट करें

मैं ओरेकल में एक ट्रिगर बनाने की कोशिश कर रहा हूं। मुझे एसक्यूएल पता है लेकिन मैंने पहले कभी ट्रिगर नहीं बनाया है। मेरे पास यह कोड है:

create or replace trigger "PASSENGER_BOOKING_T1"
AFTER
insert on "PASSENGER_BOOKING"
for each row
begin
IF (:NEW.CLASS_TYPE == 'ECO')

SELECT F.AVL_SEATS_ECOCLASS,F.FLIGHT_ID INTO SEAT, FLIGHT_INFO 
FROM BOOKING B, JOURNEY_FLIGHT J, FLIGHT F 
WHERE B.JOURNEY_ID = J.JOURNEY_ID and F.FLIGHT_ID = J.FLIGHT_ID;

UPDATE FLIGHT 
SET AVL_SEATS_ECOCLASS = (SEAT-1)
WHERE FLIGHT_ID = FLIGHT_INFO;

END IF;
end;​

Passenger_Booking तालिका में कोई प्रविष्टि होने पर यह ट्रिगर आग लगती है। और बैठने की क्षमता एक से कम हो जाती है (जो विभिन्न तालिका में है)।

चयन का चयन ठीक होना चाहिए लेकिन कहीं कहीं कुछ गलत है। क्या कोई भी कुछ सुझा सकता है?

मैंने शरीर के हिस्से को इसमें बदल दिया लेकिन अभी भी समस्याएं हैं:

UPDATE FLIGHT 
SET AVL_SEATS_ECOCLASS =
  (SELECT F.AVL_SEATS_ECOCLASS FROM BOOKING B, JOURNEY_FLIGHT J, FLIGHT F WHERE B.JOURNEY_ID = J.JOURNEY_ID and F.FLIGHT_ID = J.FLIGHT_ID;
);
1

2 उत्तर

  1. एक <�कोड> IF कथन को THEN
  2. की आवश्यकता होती है
  3. पीएल/एसक्यूएल में, आप समानता के परीक्षण के लिए = का उपयोग करते हैं, न कि ==
  4. आपको उन चरों को घोषित करने की आवश्यकता है जिन्हें आप
  5. में चुन रहे हैं

जब मैं उन तीन चीजें करता हूं, तो मुझे ऐसा कुछ मिलता है

create or replace trigger PASSENGER_BOOKING_T1
  AFTER insert on PASSENGER_BOOKING
  for each row
declare
  l_seat       flight.seat%type;
  l_flight_id  flight.flight_id%type;
begin
  IF (:NEW.CLASS_TYPE = 'ECO')
  THEN
    SELECT F.AVL_SEATS_ECOCLASS,F.FLIGHT_ID 
      INTO l_seat, l_flight_id
      FROM BOOKING B, 
           JOURNEY_FLIGHT J, 
           FLIGHT F 
     WHERE B.JOURNEY_ID = J.JOURNEY_ID 
       and F.FLIGHT_ID = J.FLIGHT_ID;

    UPDATE FLIGHT 
       SET AVL_SEATS_ECOCLASS = (l_seat-1)
     WHERE FLIGHT_ID = l_flight_id;   
  END IF;
end;​

उन वाक्यविन्यास त्रुटियों से परे, यदि मैं SELECT INTO कथन सही था तो मुझे आश्चर्य होगा। एक <�कोड> चयन करें बिल्कुल 1 पंक्ति वापस करना होगा। आपकी क्वेरी लगभग निश्चित रूप से कई पंक्तियों को वापस करनी चाहिए क्योंकि कोई भविष्यवाणी नहीं है जो क्वेरी को किसी विशेष उड़ान या किसी विशेष बुकिंग पर सीमित कर देगी। संभवतः, आप PASSENGER_ बुकिंग END_LINK/code> तालिका में एक या अधिक कॉलम में शामिल होना चाहते हैं।

इसके अतिरिक्त, यदि यह होमवर्क असाइनमेंट के अलावा कुछ और है, तो सुनिश्चित करें कि आप समझते हैं कि इस प्रकार का ट्रिगर बहु-उपयोगकर्ता वातावरण में सही ढंग से काम नहीं करता है।

4
जोड़ा
मैं इस स्पष्टीकरण को पर्याप्त रूप से ऊपर नहीं उठा सकता
जोड़ा लेखक bpgergo, स्रोत

बस एक जंगली अनुमान है

edit as Justin pointed out (thanks Justin) equality check

create or replace trigger "PASSENGER_BOOKING_T1"
AFTER
insert on "PASSENGER_BOOKING"
for each row
declare
   v_flight_id  FLIGHT.FLIGHT_ID%TYPE;
begin
IF (:NEW.CLASS_TYPE = 'ECO') THEN

SELECT F.ID into v_flight_id
FROM BOOKING B, JOURNEY_FLIGHT J, FLIGHT F 
WHERE B.ID = :NEW.BOOKING_ID -- note that I've made this up
AND B.JOURNEY_ID = J.JOURNEY_ID AND F.FLIGHT_ID = J.FLIGHT_ID;

UPDATE FLIGHT 
SET AVL_SEATS_ECOCLASS = (SEAT-1)
WHERE ID = v_flight_id;

END IF;
end;​
1
जोड़ा
यह अभी भी मुझे यह त्रुटि देता है: पीएलएस -00103: निम्नलिखित में से किसी एक की अपेक्षा करते समय "=" प्रतीक को जन्म दिया: (- + सभी केस मोड नया नल
जोड़ा लेखक Ataman, स्रोत
ठीक है, मैंने इसमें एक टाइपो संपादित किया
जोड़ा लेखक bpgergo, स्रोत