2017-10-30 12 views
0
I have 2 tables one is Schedule_table : 

    SID  NOT NULL  NUMBER(38) 
    FNUMBER     VARCHAR2(20) 
    DEPARTURE_TIME   TIMESTAMP(6) WITH TIME ZONE 
    ARRIVAL_TIME   TIMESTAMP(6) WITH TIME ZONE 
    PRICE     NUMBER 

    The second table is Flight_table 

    FNUMBER  NOT NULL VARCHAR2(20) 
    DEPARTURE_APCODE   CHAR(3) 
    ARRIVAL_APCODE   CHAR(3) 

Fnumberは、Flight_tableではPK、Schedule_tableではFKです。トリガーを使用して2つのテーブルを結合するにはどうすればよいですか?

Schedule_tableでPRICEが変更されたときにトリガーを発したい また、(Fnumber、ARRIVAL_APCODE、DEPARTURE_TIME、ARRIVAL_APCODE)のメッセージを出力する。

私はこのコードを書いたが、うまくいかなかった。

create or replace trigger schedule_trigger after update on schedule 
for each row when (new. price <> old. price) 

begin 
dbms_output.put_line('the flight number ' || :new.fnumber|| DEPARTURE_APCODE ||DEPARTURE_TIME|| ' has changed to '||:new.price ||' From'||:old.price); 
end; 

答えて

0

あなたはFlightテーブルの列を参照している - DEPARTURE_APCODEDEPARTURE_TIMEを直接これらの値を取得するために選択 を使用する必要がpossible.Youないトリガーの内部。トリガー内でDBMS_OUTPUT.PUT_LINE()を使用して

CREATE OR REPLACE TRIGGER schedule_trigger AFTER 
    UPDATE ON schedule 
    FOR EACH ROW 
    WHEN (new.price <> old.price) 
DECLARE 
    v_departure_apcode flight.departure_apcode%TYPE; 
    v_arrival_apcode  flight.arrival_apcode%TYPE; 
BEGIN 
    SELECT 
     departure_apcode, 
     arrival_apcode 
    INTO 
     v_departure_apcode,v_arrival_apcode 
    FROM 
     flight 
    WHERE 
     fnumber =:new.fnumber; 

    dbms_output.put_line('The flight number ' 
    ||:new.fnumber 
    || v_departure_apcode 
    || v_arrival_apcode 
    || ' has changed to ' 
    ||:new.price 
    || ' From ' 
    ||:old.price); 

END; 
/

そしてノートは、あなたの出力を表示しません時々SQL開発者としては役に立ちません。ログテーブルを作成し、レコードをtriggerに挿入してください。

出力を表示するには、コミットステートメントが必要な場合があります。

SET SERVEROUTPUT ON; 
UPDATE Schedule SET PRICE = 2502.00 where fnumber = 'F2004' ; 
commit; 

Commit complete. 

The flight number F2004AB CD has changed to 2502 From 2501 
関連する問題