19

私はオラクル10gとヒキガエル11.5を使用しています。匿名ブロックから API を呼び出そうとしています。

追加後に API を再コンパイルしdbms_output.put_lineて匿名ブロックを実行しようとすると、次のようなエラーが表示されます。

"ORA-06508: PL/SQL: could not find program unit being called".

ただし、現在のセッションを終了して新しいセッションを開くと、匿名ブロックはエラーなしで実行されます。

この問題により、API を変更するたびにセッションを再接続する必要があります。ヒキガエルまたはデータベースレベルで構成を行うことでこの問題を解決できる場合、誰でも助けてくれますか?

4

4 に答える 4

23

次のようなスタックの最後のエラーのみを報告していると思われます。

ORA-04068: existing state of packages has been discarded
ORA-04061: existing state of package body "schema.package" has been invalidated
ORA-04065: not executed, altered or dropped package body "schema.package"
ORA-06508: PL/SQL: could not find program unit being called: "schema.package"

もしそうなら、それはあなたのパッケージがステートフルだからです:

パッケージが (仕様または本体のいずれかで) 宣言する変数、定数、およびカーソルの値は、そのパッケージの状態を構成します。PL/SQL パッケージで少なくとも 1 つの変数、定数またはカーソルが宣言されている場合、そのパッケージはステートフルです。それ以外の場合は、ステートレスです。

再コンパイルすると、状態が失われます。

インスタンス化されたステートフル・パッケージの本体が(「ALTER PACKAGE文」を使用して明示的に、または暗黙的に)再コンパイルされた場合、パッケージ内のサブプログラムが次に起動されると、Oracle Databaseは既存のパッケージ状態を破棄し、例外ORAを発生させます。 -04068.

PL/SQLが例外を発生させた後、パッケージへの参照により、Oracle Databaseはパッケージを再インスタンス化し、パッケージを再初期化します...

パッケージに状態がある場合、これを避けることはできません。ただし、パッケージがステートフルであることが本当に必要になることはかなりまれだと思います。そのため、パッケージ内で関数またはプロシージャの外で宣言したものを再検討して、そのレベルで本当に必要かどうかを確認する必要があります。ただし、10g を使用しているため、変数やカーソルだけでなく、定数も含まれます。

ただし、引用されたドキュメントの最後の段落は、同じセッションで次にパッケージを参照するときにエラーが発生せず、通常どおりに動作することを意味します (再コンパイルするまで)。

于 2013-10-15T12:03:56.507 に答える
3

以前の回答に基づいています。私の場合は影響がなかったため、パッケージレベルでグローバル変数をプロシージャに削除することで問題を解決しました。

元のスクリプト

create or replace PACKAGE BODY APPLICATION_VALIDATION AS 

V_ERROR_NAME varchar2(200) := '';

PROCEDURE  APP_ERROR_X47_VALIDATION (   PROCESS_ID IN VARCHAR2 ) AS BEGIN
     ------ rules for validation... END APP_ERROR_X47_VALIDATION ;

/* Some more code
*/

END APPLICATION_VALIDATION; /

グローバル変数なしで同じように書き直し、V_ERROR_NAMEパッケージレベルの下のプロシージャに移動しました

変更されたコード

create or replace PACKAGE BODY APPLICATION_VALIDATION AS

PROCEDURE  APP_ERROR_X47_VALIDATION (   PROCESS_ID IN VARCHAR2 ) AS

**V_ERROR_NAME varchar2(200) := '';** 

BEGIN
     ------ rules for validation... END APP_ERROR_X47_VALIDATION ;

/* Some more code
*/

END APPLICATION_VALIDATION; /
于 2015-10-15T14:07:32.193 に答える