別の表でのOracleトリガーの更新

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テーブルに挿入があると起動します。座席数は1つ減っています(別のテーブルにあります)。

選択クエリは問題ないはずですが、どこかに何か問題があります。 誰かが何かを提案できますか?

私は体の部分をこれに変更しましたが、まだ問題があります:

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. PL/SQLでは、 == ではなく、 =
  3. 選択する変数を宣言する必要があります。

私がこれら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 テーブルの1つ以上の列に参加したいとします。

さらに、これが宿題以外のものである場合は、この種のトリガーがマルチユーザー環境で正しく機能しないことを理解しておいてください。

4
追加された
私は十分にこの説明をupvoteすることはできません
追加された 著者 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
追加された
PLS-00103:次のいずれかが予想されるときにシンボル "="が検出されました:(+ +すべてのcase mod new null
追加された 著者 Ataman,
OK、私はそれのタイプミスを編集しました
追加された 著者 bpgergo,