2013-10-15 69 views
11

私はOracle 10gおよびToad 11.5を使用しています。私は無名ブロックからapiを呼び出そうとしています。しかしORA-06508:PL/SQL:呼び出されているプログラム・ユニットが見つかりませんでした

私はdbms_output.put_lineを追加した後、APIを再コンパイルして、匿名ブロックを実行しようとした場合、それは

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

としてエラーを示して、私は現在のセッションを終了し、新しいセッションを開くと、匿名ブロックが実行されます間違いなく

この問題のため、私はAPIを変更するたびにセッションを再接続するようにしました。 ヒザやデータベースレベルで設定を行うことでこの問題を解決できる場合は誰でも手伝ってください。

+2

としてパッケージレベル下の手順に移動します。また、何かを得ていますのような '既存のパッケージ状態は破棄されました'?それを実行している場合は、同じセッションで2度目に作業する必要があります。しかし、それはあなたのパッケージにある状態、つまりプロシージャではなくパッケージに宣言された変数があることを示唆します(そして 'dbms_output'とは関係ありません)。 –

答えて

21

私はあなただけのように、スタック内の最後のエラーを報告している疑いがある:変数、定数、およびカーソルの

値:

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" 

もしそうなら、それはyour package is statefulためですパッケージ は、パッケージ 状態を(その仕様または本文のいずれかに)宣言します。 PL/SQLパッケージが少なくとも1つの変数、定数、 またはカーソルを宣言する場合、パッケージはステートフルです。それ以外の場合はステートレスです。

あなたは状態が失われ、再コンパイル:

インスタンス化、ステートフルなパッケージは(「ALTER PACKAGE文」で、どちらか 明示的、または暗黙的に)再コンパイルされるのボディの場合、 パッケージ内の次のサブプログラムの起動により、Oracle Database は既存のパッケージの状態を破棄し、例外 ORA-04068を発生させます。

PL/SQLで例外が発生した後、パッケージへの参照があればあなたはこれを避けることができない、再初期化 それ...

、再インスタンスパッケージに Oracleデータベースを引き起こしあなたのパッケージには状態があります。しかし、実際にはパッケージがステートフルである必要があるのは非常にまれだと思うので、パッケージ内で宣言したものを関数やプロシージャの外で再訪して、そのレベルで本当に必要かどうかを確認する必要があります。あなたは10gだから、それには変数とカーソルだけでなく、定数が含まれています。

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

+0

完全にあなたに同意します。私はそれについての想像上の数字に気を付けることができた。ちょうどその地獄のprocを実行します。私は呼び出しているanonブロックからそれを除外しようとしました、そして、その魔法の旗がクリアされる前に完全に実行する必要があります。刺激する! –

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;/
関連する問題