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

So rufen Sie eine Prozedur auf, die dieselbe Tabelle nach dem Trigger verwendet

Das kannst du nicht.

Ein normaler Trigger auf Zeilenebene kann die Tabelle, für die der Trigger definiert ist, nicht abfragen, da dies eine mutierende Tabellenausnahme auslösen würde. Ich gehe davon aus, dass Sie deshalb Ihren Trigger für die Verwendung einer autonomen Transaktion deklariert haben (eine autonome Transaktion für etwas anderes als die dauerhafte Protokollierung ist mit ziemlicher Sicherheit ein Fehler). Wenn Sie dies jedoch tun, kann Ihr Auslöser die nicht festgeschriebenen Änderungen, die von der auslösenden Transaktion vorgenommen wurden, nicht sehen. Das ist das Problem, auf das Sie jetzt stoßen.

Eine Alternative wäre die Verwendung eines zusammengesetzter Trigger . Sie würden eine Sammlung von test_table.type_%type deklarieren , würden Sie die Werte, die sich ändern, zu dieser Sammlung im Teil Ihres Triggers auf Zeilenebene hinzufügen, und dann würden Sie die Elemente in der Sammlung im Nach-Anweisungsteil Ihres Triggers durchlaufen. Ein Trigger auf Anweisungsebene darf die Tabelle abfragen, in der der Trigger definiert ist, sodass Sie Ihre Prozedur aus dem Nach-Anweisungsteil Ihres zusammengesetzten Triggers aufrufen können.