Wie kann man das Oracle trigger verursacht Rekursion Problem
Ich weiß nicht, ob ich klar genug mit meiner Frage. Ich habe eine Datenbank für ein transport-Unternehmen, das speichert das Datum und die Zeit aller Reisen, die ich bin versucht zu verhindern, dass jemand von der Reservierung eines Tickets eine Stunde vor der planmäßigen Abflugzeit oder ein ticket kaufen, nach der Abreise, Datum und Zeit.
Ich habe versucht, erstellen Sie einen trigger für diese, aber für einige Grund es mir nicht erlauben, erstellen Sie ein ticket, wenn es im Einklang mit den zeitlichen Anforderungen. Es gibt mir eine Fehlermeldung
ERROR at line 1:
ORA-00036: maximum number of recursive SQL levels (50) exceeded
ORA-00036: maximum number of recursive SQL levels (50) exceeded
Hier ist der code für meine trigger:
CREATE OR REPLACE TRIGGER validHour
BEFORE INSERT OR UPDATE
ON ticket
FOR EACH ROW
DECLARE x number;
BEGIN
select EXTRACT(DAY FROM (departure - sysdate)) * 1440 + EXTRACT(HOUR FROM (departure - sysdate)) * 60 + EXTRACT(MINUTE FROM (departure - sysdate))
into x
from trip
where trip.tripid=:new.tripid;
IF :new.status = 'Reserved' AND x<= 59 THEN
raise_application_error(-20000,'You can only reserve an hour before departure');
ELSIF :new.status = 'Purchased' AND x<= 0 THEN
raise_application_error(-20000,'You can only purchase before departure');
ELSE
INSERT INTO ticket(name, lastname, status, reservationid, cardnumber, tripid, seatnum)
VALUES(:new.name, :new.lastname, :new.status, :new.reservationid, :new.cardnumber, :new.tripid, :new.seatnum);
END IF;
END;
/
Wenn Sie erstellen einen trigger für diese ist nicht der richtige Weg, wie könnte ich sonst tun?
- Sollte Ihr before-insert-trigger werden Berufung einlegen?
select (departure - sysdate) * 60 * 24 from trip
geben Sie einen Betrag von Minuten zwischen diesen Terminen, keine Notwendigkeit zuextract
- Ich wusste nicht, dass! Ich kämpfte so sehr, immer diese Wert, und ich wünschte, ich wusste, es war so einfach. Danke für die info!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Weil Sie einfügen einer weiteren Zeile innerhalb der trigger. Wenn Sie nicht heben Sie die Fehler, lass Sie gehen. Der Einsatz wird gehen, da der trigger gefeuert wurde weil des Einsatzes in den ersten Platz. Sie müssen nicht legen Sie wieder die gleichen Daten.
Durch einfügen einer weiteren Zeile in
ticket
Sie Feuer erneut den Auslöser, etc. das führt zu der Stapel-Ausnahme.Diese:
ist genug. (Ich habe den Fehler korrigiert zahlen)
Ihre trigger wird aufgerufen, weil Sie eine andere einfügen in es.
Nehmen Sie den Einsatz aus. Ein BEFORE-INSERT-trigger wird als Teil der insert - /update-DML. Wenn Ihre Validierung geht, gibt es nichts, was Sie brauchen, zu tun, wie das einfügen abzuschließen.