簡體   English   中英

Oracle觸發另一個表的更新

[英]Oracle Triggers Update at Another Table

我正在嘗試在Oracle中創建觸發器。 我知道sql,但我從未創建過觸發器。 我有以下代碼:

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. IF語句需要THEN
  2. 在PL / SQL中,使用=來測試是否相等,而不是==
  3. 您需要聲明要選擇的變量

當我做這三件事時,我會得到這樣的東西

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語句正確,我會感到震驚。 SELECT INTO必須恰好返回1行。 您的查詢幾乎肯定會返回多行,因為沒有謂詞會將查詢限制為特定的航班或特定的預訂。 大概您想加入PASSENGER_BOOKING表中的一列或多列。

此外,如果這不是家庭作業,則請確保您了解這種觸發器在多用戶環境中無法正常工作。

只是一個瘋狂的猜測

編輯賈斯汀指出(感謝賈斯汀)平等檢查

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;​

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM