パッケージの状態

パッケージ(の仕様部または本体のいずれか)で宣言している変数、定数およびカーソルの値が、パッケージの状態を構成します。

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_ERRORTRUEに設定されている場合は、ORA-04068が発生するのみでなく、セッションがただちに終了します。多くのアプリケーションはセッションの破棄に対処する準備が整っており、リカバリが簡略化されているため、これは好都合である可能性があります。

関連項目: