2011-06-23 17 views
3

私はOracleを使用していますが、一部のトリガーとパッケージでコードを変更しました。 私は(トリガーを起動する)コードを変更するスクリプトファイルを実行して、テーブルの上にアップデートをしようとすると、私はパッケージの既存の状態を取得していますが、私はエラーパッケージの既存の状態が破棄されました - Oracle

ORA-04068: 
ORA-04061: 
ORA-04065: 
ORA-06512:--Trigger error -- line 50 
ORA-04088: 
の束を取得しています

を破棄しました

このエラーは初めて発生します。これを避けるためのインプットは非常に高く評価されます。ありがとうございました!

+0

http://stackoverflow.com/questions/1761595/ oracle-or-04068-existing-of-packages-has-been-discardedであることを確認してください。 –

答えて

3

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に伝えられ、それは結果をキャッシュして関数を呼び出す回避することができます。

これは使用例ではなく、セッション間で変数を共有する必要がある場合は、テーブルを使用してクエリを実行します。任意の頻度で使用されると、テーブルはバッファキャッシュメモリに格納されるため、セッション変数の問題なしにメモリ内の記憶領域を確保できます。

+0

良いアイデア。私の回答と同様に、OPの使用の意味も理解する必要があります。http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:6978972926020 –

3

あなたのスクリプトは、時代遅れのコードをキャッシュする可能性があります。だから、マイケルPakhanstovsリンクから、あなたのスクリプトの先頭に

DBMS_SESSION.RESET_PACKAGE 

を実行することができたり、スクリプトで

PRAGMA SERIALLY_REUSABLE; 

を使用しています。

注しかし両方の意味:

http://download.oracle.com/docs/cd/B13789_01/appdev.101/b10807/13_elems046.htm

http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14258/d_sessio.htm#i1010767

http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:2298325131459

AskTom DBMS_SESSION.RESET_PACKAGEオン:

DBMS_SESSION.RESET_PACKAGE、一方MUCH 速くログアウトしてから、 パフォーマンスに影響があります(明らかにしていないので、 として速くはありません!)。 これは、 のセッション状態全体をリッピングします。たとえば、開かれたすべてのカーソル (準備済みの文)は となります。 PRAGMA SERIALLY_REUSABLEの

AskTom:

その基本的にあなたが パッケージを使用している場合、あなたはそのパッケージ 状態を保存しないと、パッケージの永続性を持つ を避けたいと思います」と言ってあなたのセッションで - 少ないメモリ - この

関連する問題