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;
);
ベストアンサー
-
IF
ステートメントにはTHEN
- 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
テーブルの1つ以上の列に参加したいとします。
さらに、これが宿題以外のものである場合は、この種のトリガーがマルチユーザー環境で正しく機能しないことを理解しておいてください。