SERIALLY_REUSABLEのみ一定のパッケージ変数のために理にかなって を使用しています。
このエラーを回避し、パフォーマンスを維持する方法は1つだけあります(reset_packageは実際には適していません)。 PL/SQLパッケージ内のパッケージ・レベル変数は避けてください。 Oracleのサーバー・メモリーは、状態を格納するための適切な場所ではありません。
何かが実際に変更されない場合は、計算が高価であり、関数の戻り値を超える再利用することができ、オーバー再計算せずに、その後、DETERMINISTICはその点で役立ちます
例:これをしない: varchar2(100)cached_result;
function foo return varchar2 is
begin
if cached_result is null then
cached_result:= ... --expensive calc here
end if;
return cached_result;
end foo;
INSTEAD
function foo return varchar2 DETERMINISTIC is
begin
result:=... --expensive calc here
return result;
end foo;
これを行う決定論的には、与えられた入力のために、結果が変化しないことがOracleに伝えられ、それは結果をキャッシュして関数を呼び出す回避することができます。
これは使用例ではなく、セッション間で変数を共有する必要がある場合は、テーブルを使用してクエリを実行します。任意の頻度で使用されると、テーブルはバッファキャッシュメモリに格納されるため、セッション変数の問題なしにメモリ内の記憶領域を確保できます。
http://stackoverflow.com/questions/1761595/ oracle-or-04068-existing-of-packages-has-been-discardedであることを確認してください。 –