RESETTABLE句

RESETTABLE句は、PL/SQLユニットが安全だと判断した場合に、セッションによってそのユニットの状態を破棄できるかどうかのマークを付けるために使用されます。

RESETTABLE PL/SQLユニットの状態が破棄された場合、同じセッション内のユニットに対する後続の参照によって、そのユニットが初期化を実行します。RESETTABLEの使用は、パッケージの既存の状態が破棄された場合、およびdatapatch中にパッケージが変更された場合に発生する可能性があるORA-04068を回避できるので、SQLパッチを使用するユーザーにとって有益です。

RESETTABLE句は、次の文に指定できます:

構文

resettable_clause ::=



セマンティクス

resettable_clause

RESETTABLE

パッケージまたはパッケージ本体は、RESETTABLE句がパッケージ仕様部またはパッケージ本体の定義にそれぞれ存在する場合、リセット可能です。

RESETTABLE句は、パッケージおよびパッケージ本体の作成時に指定できます。この句は、パッケージ仕様部および本体で独立して設定されます。つまり、プロパティが必ずしも一致するとはかぎりません。パッケージ仕様部およびパッケージ本体の間の設定の組合せは有効です。

パッケージのRESETTABLEプロパティを更新するには、CREATE OR REPLACE PACKAGE [BODY] RESETTABLE構文を使用します。ALTER PACKAGE [BODY]構文を使用してプロパティを変更することはできません。

RESETTABLE句は、SERIALLY_REUSABLEプラグマと組み合せて使用できません。

使用上のノート

プロパティを指定する場合は、ユニットの状態が実際にはRESETTABLEであることを確認する必要があります。たとえば、一般に、オープン・クローズ・メカニズムに従う必要のある(および、すぐにサイクルを完了しない)インストゥルメントを含むパッケージは、メカニズムがクローズされる前に状態が破棄されるとメモリー・リークが発生する可能性があるため、RESETTABLEとしてマークしても安全ではありません。一方、再インスタンス化中に再度取得できる情報を含むパッケージは、安全にRESETTABLEとしてマークできます。

RESETTABLEとマークされたパッケージに変更を加える場合は、その変更によってパッケージがリセットできなくなるかどうかを考慮する必要があります。

例14-36 RESETTABLEパッケージ本体の作成

CREATE OR REPLACE PACKAGE res_pkg RESETTABLE AS
    FUNCTION get_current_user
    RETURN VARCHAR2;
END;
/

CREATE OR REPLACE PACKAGE BODY res_pkg RESETTABLE AS 
    
    NAME    VARCHAR2(50);
    ID      PLS_INTEGER;
    MAX_L CONSTANT PLS_INTEGER := ORA_MAX_NAME_LEN;

    FUNCTION get_current_user RETURN VARCHAR2 
    IS
    BEGIN
        RETURN DBMS_ASSERT.enquote_name(SYS_CONTEXT('USERENV', 
                                            'CURRENT_USER'), FALSE);
    END get_current_user;
END;
/