2017-04-15 2 views
0

je faisais une application sur oracle apex. maintenant, Si la capacité (cap) est 0, ce déclencheur doit supprimer le tuple nouvellement inséré car passenger_id ne sera pas valide. qu'est-ce que je fais mal ici?Si la capacité (cap) est 0, ce déclencheur doit supprimer le tuple nouvellement inséré. qu'est-ce que je fais mal ici? voici le code

Voici le code

create or replace trigger Ticket_katbo 
before insert on passenger 
for each row 
declare 
newcap number; 
cap number; 
flightpk number; 
begin 
flightpk := :new.flight_fid; 
select flight_capacity into cap from flight where fid = flightpk; 
if (cap>0) THEN 
newcap := cap-1; 
update flight set flight_capacity = newcap where fid = flightpk ; 
ELSIF (cap=0 or cap = NULL) THEN 
Delete from passenger where passenger_id = :new.passenger_id; 
END IF; 
end; 
+0

Quel est le problème que vous rencontrez? –

+0

Je vous conseille de créer une validation sur la page en apex et montrer une erreur de cette façon au lieu de laisser la transaction se produire et attraper cela dans un déclencheur par défaut. C'est pour cela que les validations sont faites. – Tom

Répondre

0

Vous faites cela avant l'insertion. Donc, augmenter une erreur si la capacité n'est pas là:

create or replace trigger Ticket_katbo 
before insert on passenger 
for each row 
declare 
    v_capacity number; 
begin 
    select flight_capacity into v_capacity 
    from flight 
    where fid = :new.flight_fid; 

    if (cap <= 0) then 
     raise_application_error(-20001, 
           'No capacity for another passenger'); 
    end if; 

    update flight 
     set flight_capacity = flight_capacity - 1 
     where fid = :new.flight_fid; 
end; 
+0

Merci beaucoup! @Gordon Linoff –