最近Autonomous Databaseに追加された初期化パラメータSESSION_EXIT_ON_PACKAGE_STATE_ERRORの動作を確認しました。その作業ログです。
東京リージョンのAlways FreeのATPで作業を行なっています。
最初に初期化パラメータの有無を確認します。データベース・アクションを使用します。
----------------------------------- ----- ---------------- ----------------
session_exit_on_package_state_error FALSE TRUE IMMEDIATE
set serveroutput on
select sys_context('USERENV','SESSIONID') sessionid, status from all_objects
where object_type = 'PACKAGE BODY'
and object_name = 'MY_PARENT_PKG'
and owner = 'APEXDEV';
begin
dbms_output.put_line(my_parent_pkg.count_up(1));
end;
/
select sys_context('USERENV','SESSIONID') sessionid, status from all_objects
where object_type = 'PACKAGE BODY'
and object_name = 'MY_PARENT_PKG'
and owner = 'APEXDEV';
SQL> @child_pkg1
Package CHILD_PKGがコンパイルされました
Package Body CHILD_PKGがコンパイルされました
SQL> alter package my_parent_pkg compile body;
Package MY_PARENT_PKGが変更されました。
SQL>
SQL> @s01
SESSIONID STATUS
_____________ _________
2197167149 VALID
2
PL/SQLプロシージャが正常に完了しました。
SESSIONID STATUS
_____________ _________
2197167149 VALID
SQL>
SQL> @s01
SESSIONID STATUS
_____________ _________
2197167149 VALID
3
PL/SQLプロシージャが正常に完了しました。
SESSIONID STATUS
_____________ _________
2197167149 VALID
SQL>
SQL> @s01
SESSIONID STATUS
_____________ __________
2197167149 INVALID
次の開始中にエラーが発生しました : 行 6 ファイル @ /Users/ynakakoshi/Documents/ora4061/s01.sql
コマンド -
begin
dbms_output.put_line(my_parent_pkg.count_up(1));
end;
エラー・レポート -
ORA-04068: パッケージの既存状態は廃棄されました。
ORA-04061: package "APEXDEV.CHILD_PKG"の既存状態は無効になりました。
ORA-04065: package "APEXDEV.CHILD_PKG"は変更/削除されているので、実行できません
ORA-06508: PL/SQL: コールしているプログラム単位が見つかりませんでした: "APEXDEV.CHILD_PKG"
ORA-06512: "APEXDEV.MY_PARENT_PKG", 行7
ORA-06512: 行2
04068. 00000 - "existing state of packages%s%s%s has been discarded"
*Cause: One of errors 4060 - 4067 when attempt to execute a stored
procedure.
*Action: Try again after proper re-initialization of any application's
state.
SESSIONID STATUS
_____________ _________
2197167149 VALID
SQL>
SQL> @s01
SESSIONID STATUS
_____________ _________
2197167149 VALID
101
PL/SQLプロシージャが正常に完了しました。
SESSIONID STATUS
_____________ _________
2197167149 VALID
SQL>
SQL> @s01
SESSIONID STATUS
_____________ _________
2071203142 VALID
3
PL/SQLプロシージャが正常に完了しました。
SESSIONID STATUS
_____________ _________
2071203142 VALID
SQL>
SQL> @s01
SESSIONID STATUS
_____________ __________
2071203142 INVALID
次の開始中にエラーが発生しました : 行 6 ファイル @ /Users/ynakakoshi/Documents/ora4061/s01.sql
コマンド -
begin
dbms_output.put_line(my_parent_pkg.count_up(1));
end;
エラー・レポート -
ORA-04068: パッケージの既存状態は廃棄されました。
ORA-04061: package "APEXDEV.CHILD_PKG"の既存状態は無効になりました。
ORA-04065: package "APEXDEV.CHILD_PKG"は変更/削除されているので、実行できません
ORA-06508: PL/SQL: コールしているプログラム単位が見つかりませんでした: "APEXDEV.CHILD_PKG"
ORA-06512: "APEXDEV.MY_PARENT_PKG", 行7
ORA-06512: 行2
04068. 00000 - "existing state of packages%s%s%s has been discarded"
*Cause: One of errors 4060 - 4067 when attempt to execute a stored
procedure.
*Action: Try again after proper re-initialization of any application's
state.
次の開始中にエラーが発生しました : 行 10 ファイル @ file:/Users/ynakakoshi/Documents/ora4061/s01.sql
コマンド -
select sys_context('USERENV','SESSIONID') sessionid, status from all_objects
where object_type = 'PACKAGE BODY'
and object_name = 'MY_PARENT_PKG'
and owner = 'APEXDEV'
コマンド行 : 10 列 : 1 ファイル @ file:/Users/ynakakoshi/Documents/ora4061/s01.sql でのエラー
エラー・レポート -
SQLエラー: クローズされた接続です。
SQL>
SQL> @s01
SESSIONID STATUS
_____________ _________
3423382160 VALID
101
PL/SQLプロシージャが正常に完了しました。
SESSIONID STATUS
_____________ _________
3423382160 VALID
SQL>
SQL> @s01
SESSIONID STATUS
_____________ _________
3423382160 VALID
3
PL/SQLプロシージャが正常に完了しました。
SESSIONID STATUS
_____________ _________
3423382160 VALID
SQL> begin
2 dbms_session.reset_package;
3 end;
4* /
PL/SQLプロシージャが正常に完了しました。
SQL> @s01
SESSIONID STATUS
_____________ __________
3423382160 INVALID <- SESSIONIDに変化はない。
101 <- パッケージが入れ替わっている。
PL/SQLプロシージャが正常に完了しました。
SESSIONID STATUS
_____________ _________
3423382160 VALID
SQL>