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

ORA-04061:Der vorhandene Status des Pakettexts PACKAGE.NAME wurde ungültig gemacht, bleibt bestehen

Oracle tut dies, weil die Neukompilierung eines PL/SQL-Pakets alle verwendeten Sitzungsvariablen ungültig macht.

Es gibt nicht viel, was wir tun können, um dies zu vermeiden, außer indem wir bewährte Bereitstellungspraktiken anwenden. Stellen Sie keine Änderungen bereit, während die Datenbank verwendet wird, stellen Sie sicher, dass alle Verbindungen ordnungsgemäß getrennt sind usw. Leichter gesagt als getan im Zeitalter von CI/CD, null Ausfallzeiten und anderen spannenden Innovationen.

Es gibt also eine Sache im hinteren Teil des Schließfachs:pragma serially_reusable; . Diese Anweisung bedeutet, dass der Zustand des Pakets für die Dauer eines einzelnen Serveraufrufs beibehalten wird . Wenn wir zum Beispiel einen PL/SQL-Block haben, der eine SR-Prozedur dreimal aufruft, werden alle Variablen, die durch diese Prozedur geändert werden, den Wert über die drei Aufrufe beibehalten. Aber das nächste Mal, wenn wir den Block ausführen – in derselben Sitzung – werden die Variablen auf ihre Startwerte zurückgesetzt worden sein.

Es gibt mehrere Einschränkungen für seriell wiederverwendbares PL/SQL – zum Beispiel kann es nicht in SQL-Abfragen verwendet werden. Aber die große Attraktion aus Ihrer Sicht sind keine ORA-04068- oder ORA-04061-Fehler mehr. Kein Sitzungsstatus, nichts zu entwerten.

pragma serially_reusable muss auf Paketebene deklariert werden und sowohl im Hauptteil als auch in der Spezifikation. Daher müssen Sie sicher sein, dass keine der gepackten Prozeduren den Status über Serveraufrufe hinweg beibehalten muss.