パッケージの状態
パッケージ(の仕様部または本体のいずれか)で宣言している変数、定数およびカーソルの値が、パッケージの状態を構成します。
PL/SQLパッケージに1つ以上の変数、定数またはカーソルが宣言されている場合、このパッケージはステートフルですが、それ以外の場合はステートレスです。
パッケージ項目を参照する各セッションは、そのパッケージの独自のインスタンス化を所有します。パッケージがステートフルの場合は、インスタンス化にパッケージの状態が含まれます。
パッケージの状態は、次の状況を除き、セッションが存続する間維持されます。
-
パッケージが
SERIALLY_REUSABLE
の場合。 -
パッケージ本体が再コンパイルされている場合。
インスタンス化されたステートフル・パッケージの本体が再コンパイルされている場合は(「ALTER PACKAGE文」を使用した明示的な再コンパイルであっても、暗黙的な再コンパイルであっても)、このパッケージで次にサブプログラムを起動すると、Oracle Databaseは既存のパッケージ状態を破棄して例外ORA-04068を呼び出します。
PL/SQLによって例外が呼び出された後にパッケージを参照すると、Oracle Databaseによりパッケージが再インスタンス化され、再初期化されます。したがって、パッケージ状態に対する以前の変更は失われます。
-
セッションが所有するインスタンス化されたパッケージのいずれかが、無効化された後に再有効化されている場合。
セッションが所有するインスタンス化されたパッケージのいずれかが無効化された後に再有効化されている場合、セッションのパッケージ・インスタンス化は(パッケージの状態を含め)すべて失われる可能性があります。
セッションが存続する間(またはそれより長い間)パッケージの状態が一定である場合、パッケージはOracle Databaseにステートレスとして処理されます。これは、パッケージの項目がすべてコンパイル時定数になっているパッケージの場合です。
コンパイル時定数とは、コンパイル時にPL/SQLコンパイラで値を決定できる定数のことです。初期値にリテラルが指定されている定数は、必ずコンパイル時定数になります。初期値にリテラル以外が指定されていても、オプティマイザによりリテラルに縮約される定数も、コンパイル時定数です。リテラル以外の式をPL/SQLオプティマイザでリテラルに縮約できるかどうかは、最適化レベルによって異なります。そのため、ある最適化レベルでコンパイルするとステートレスになるパッケージが、別の最適化レベルでコンパイルするとステートフルになることもあります。
Oracle Database 19c、リリース更新19.23以降では、初期化パラメータSESSION_EXIT_ON_PACKAGE_STATE_ERROR
を使用して、パッケージの状態が無効になった場合の動作を指定できます。ステートフルPL/SQLパッケージが変更された場合、そのパッケージのアクティブなインスタンス化が含まれているセッションでは、そのパッケージの実行が試みられると次のエラーが発生します:
ORA-04068: existing state of package has been discarded
SESSION_EXIT_ON_PACKAGE_STATE_ERROR
がTRUE
に設定されている場合は、ORA-04068が発生するのみでなく、セッションがただちに終了します。多くのアプリケーションはセッションの破棄に対処する準備が整っており、リカバリが簡略化されているため、これは好都合である可能性があります。
関連項目:
-
初期化の詳細は、「パッケージのインスタンス化および初期化」を参照してください
-
スキーマ・オブジェクトの無効化および再有効化の詳細は、『Oracle Database開発ガイド』を参照してください
-
オプティマイザの詳細は、「PL/SQLオプティマイザ」を参照してください
SESSION_EXIT_ON_PACKAGE_STATE_ERROR
の詳細は、『Oracle Databaseリファレンス』を参照してください。