Oracle 23ai Funktionalität in Oracle 19c: SESSION_EXIT_ON_PACKAGE_STATE_ERROR

In dieser Mini-Serie gehe ich auf Oracle 23ai Funktionalitäten ein, die auf Oracle 19c zurückportiert wurden.

Schon mit Oracle 19.23 ist eine Funktionalität, die mit Oracle 23ai eingeführt wurde, auch in Oracle 19c umgesetzt worden – der Instance Parameter SESSION_EXIT_ON_PACKAGE_STATE_ERROR wurde eingeführt.

Um diesen zu verstehen, muss man etwas ausholen:

Was ist ein Package State?

Ein Package State bezieht sich auf PL/SQL Datenbank Packages, die in der Packagedefinition Variablen, Konstanten und Cursor definieren. Beim ersten Aufruf eines PL/SQL Packages – beispielsweise nach einem restart der Datenbank Instanz – werden die in der Packagedefinition deklarieren Variablen und Konstanten initialisiert. Durch die Nutzung des Packages in Datenbank Sessions, können die Inhalte der Variablen natürlich geändert werden (die der Konstanten natürlich nicht).

Sollte das Package jetzt aber im laufenden Betrieb invalidiert werden – beispielsweise weil ein vom Package referenziertes Objekt (Tabelle, View,…) mittels DDL modifiziert wurde – muss das Package bei der nächsten Nutzung recompiliert und reinitialisiert werden. Dadurch gehen die Inhalte der Variablen natürlich verloren.

Versucht man nun in einer Session auf dieses Package zuzugreifen, hat Oracle bisher die Session mittels des Fehlers:

ORA-04068: existing state of package has been discarded

über den Umstand informiert und die Applikation müsste entsprechend darauf reagieren. In der Praxis ist dies all zu oft nicht korrekt umgesetzt, wodurch manche Sessions einfach den Fehler ignorieren und weiter arbeiten – jetzt aber mit den „falschen“ Werten in den Variablen. Dadurch kann es zu unvorhergesehenen Problemen in der Applikation kommen.

Was bewirkt der Instance Parameter nun?

Wir der Parameter SESSION_EXIT_ON_PACKAGE_STATE_ERROR auf TRUE gesetzt (der Default ist FALSE), terminiert Oracle alle Sessions, die den Fehler ORA-04068: existing state of package has been discarded erhalten würden. Dadurch wird sichergestellt, dass die Session nicht mit Fehlern weiterarbeiten kann. Der Benutzer muss sich entsprechend neu anmelden und durch die Anmeldung sollte sichergestellt werden, dass die Package Variablen wieder korrekt initialisiert sind.

Kann man den Parameter auch Sessionweise konfigurieren?

Zum Glück: Ja!

Der Parameter kann auch in einer Session mittels folgendem Befehl gesetzt werden:

ALTER SESSION SET SESSION_EXIT_ON_PACKAGE_STATE_ERROR = TRUE;

Damit kann man für verschiedenen Applikationen in der gleichen Datenbank entsprechend das gewünschte Verhalten beispielsweise mit Hilfe von Logon-Triggern sicherstellen.