2017-11-25 13 views
2

新しいレコードがticket_priceの表の中に挿入されるたびに、予約値を増加させるトリガーを作成しようとしています。レコードが削除された場合は、予約された値を減らして使用可能な値を増やしたいと考えています。私は成功したINSERTのトリガ仕事をすることができていますが、私はレコードを削除しようとするたびPL/SQL ORACLE:削除時の更新のトリガー

、私は彼が私が取得エラーですrecord.Tの削除に値を更新するために同じことを行うことができません

ORA-01403: no data found 
ORA-06512: at "K.CAL", line 6 
ORA-04088: error during execution of trigger 'K.CAL' 

私は削除している同じテーブルではなく、別のテーブルの値を更新しています。ここで

は、トリガのための私のコードです:

CREATE OR REPLACE TRIGGER cal 
    BEFORE INSERT OR DELETE ON TICKET_PRICE FOR EACH ROW 
DECLARE 
    V_TICKET TICKET_PRICE.TICKETPRICE%TYPE; 
    V_BOOKED FLIGHTSEAT.BOOKED_SEATS%TYPE; 
    V_AVAILABLE FLIGHTSEAT.AVAILABLE_SEATS%TYPE; 
BEGIN 
    SELECT BOOKED_SEATS,AVAILABLE_SEATS 
    INTO V_BOOKED,V_AVAILABLE 
    FROM FLIGHTSEAT 
    WHERE SEAT_ID=:NEW.SEAT_ID; 
    IF INSERTING THEN 
     V_BOOKED:=V_BOOKED+1; 
     V_AVAILABLE:=V_AVAILABLE-1; 
     UPDATE FLIGHTSEAT 
     SET BOOKED_SEATS=V_BOOKED, AVAILABLE_SEATS=V_AVAILABLE 
     WHERE SEAT_ID=:NEW.SEAT_ID; 
    ELSIF DELETING THEN 
     V_BOOKED:=V_BOOKED-1; 
     V_AVAILABLE:=V_AVAILABLE+1; 
     UPDATE FLIGHTSEAT 
     SET BOOKED_SEATS=V_BOOKED, AVAILABLE_SEATS=V_AVAILABLE 
     WHERE SEAT_ID=1; 
    END IF; 
END; 

答えて

1

あなたがいることを正しく推測している:new.seatを削除するために、更新には使用できません。しかし、どちらもそれを選択することはできません。あなたはsea_id = 1が更新される必要があることを知ることができますか?削除された行データを参照するには、Old.column name;この場合はselectとupdateの両方のold_seat_idが使用されます。

しかし、選択する必要はありません。注:さらに、seat_idが一意であるという暗黙の前提があります。私はそれを以下に受け入れます。

create or replace trigger cal 
    before insert or delete on ticket_price 
    for each row 
declare 
v_seat_id   flightseat.seat_id%type;   
v_booked   flightseat.booked_seats%type;  

begin 
    if INSERTING then 
     v_booked := 1; 
     v_seat_id := :new.seat_id; 
    else 
     v_booked := -1; 
     v_seat_id := :old.seat_id; 
    end if; 

    update flightseat 
     set booked_seats=booked_seats+v_booked 
     , available_seats=available_seats-v_booked 
    where seat_id = v_seat_id; 

end; 
+0

申し訳ありませんが、私は自分自身をとてもうまく説明したとは思わないのです。私は値が飛行機と呼ばれる別のテーブルに追加されることを意味した。だから私はちょっと私が思うように選択する必要があります – Kim

+0

他のテーブルflightseatそれから最初に選択する必要はありません。 update ... set col = col + incrを選択し、col ...をvarに選択します。 var = var + inct; update ... set col - var;両方ともまったく同じ結果を生み出します。 – Belayer

+0

Worked。本当にありがとう。あなたは素晴らしいです! – Kim

関連する問題