Oracle
 sql >> Datenbank >  >> RDS >> Oracle

ungültiger Triggerfehler

Ok, ich werde dies als Antwort posten, da Kommentare nicht so viel Text zulassen.

Wenn ich Ihre Tabellen sehe, sind einige Dinge immer noch nicht klar. Ihre Funktion ADD_PACIENTE_QUARTO implementiert ein SELECT Anweisung, die das Prädikat Where PAC = CONT angibt aber PAC ist nicht in PACIENTE 's Spezifikation, sondern ist die lokale Variable, in der Sie Ihr Ergebnis und CONT speichern ist Ihr Parameter, es ist nicht klar, was Sie dort versucht haben.

Jetzt hat Ihr Trigger einige Fehler in Logik und Implementierung.

Zunächst einmal lautet der Name Ihres Auslösers PACIENTE_TRIGGER sondern die Zeile INSERT OR UPDATE ON TIPO_QUARTO sagt mir, dass es auf dem TIPO_QUARTO ist Tabelle, dies ist syntaktisch kein Problem, kann aber logischerweise ein Ärgernis für jemanden sein, der herauszufinden versucht, zu welcher Tabelle der Trigger gehört.

Verwenden Sie als Nächstes INSERT OR UPDATE OF TIPO ON TIPO_QUARTO um Einfügungen zu überwachen oder Änderungen nur zu aktualisieren in der Spalte TIPO von TIPO_QUARTO Tabelle.

Nun diese Zeile If :new.TIPO_QUARTO = 'UTI' then , vorausgesetzt, dieser Trigger ist an TIPO_QUARTO angehängt Tabelle, diese Tabelle hat keine Spalte namens TIPO_QUARTO ändern Sie dies in :new.TIPO .

Als nächstes PAC ist vom Typ VARCHAR daher ist mir unklar, was Sie in PAC := PAC - :new.TIPO; zu tun versuchen und in PAC := PAC + :new.TIPO; beide Zeilen geben invalid number aus Ausnahme, da Sie keine Zeichenfolgen hinzufügen oder subtrahieren können, vielleicht war Ihre Absicht, eine Teilzeichenfolge zu verketten oder zu erhalten.

Und zuletzt der Aufruf von UPDATE TIPO_QUARTO SET TIPO = PAC innerhalb eines Triggers für TIPO_QUARTO führt zu mutating table Ausnahme:Sie können keine Tabelle abfragen/aktualisieren, die sich mitten in einer DML-Anweisung befindet (INSERT oder UPDATE in diesem Fall). Um dies zu beheben, können Sie einfach :new.TIPO := PAC zuweisen .

Kümmern Sie sich um diese Details und vielleicht ist Ihr Problem dann nicht mehr da.