web-dev-qa-db-ja.com

PLS-00302を取得する理由:コンポーネントは存在するときに宣言する必要がありますか?

Oracle 10.2を使用しています。

いくつかのスクリプトで、一部のOracleオブジェクトをあるSCHEMA(S1)から別のSCHEMA(S2)に移動しています。 DBAロールを持つ関数を作成しています。移動すると、機能の1つが無効になりますが、その理由はわかりません。そのコードは次の行に沿っています:

MY_FUNC

_CREATE OR REPLACE FUNCTION S2."MY_FUNC" RETURN VARCHAR2 IS
   something VARCHAR2;
   othervar VARCHAR2 (50):= 'TEST';   
BEGIN
   something := S2.MY_FUNC2();
    /*some code*/
    return othervar;
END;
/
_

スキーマなしで_MY_FUNC2_を使用すると、動作します:
something := MY_FUNC2();something := S2.MY_FUNC2();の代わりに

My_FUNC2

_CREATE OR REPLACE FUNCTION S2."MY_FUNC2" RETURN VARCHAR2 IS
       something BOOLEAN;
       othervar VARCHAR2 (50) := 'TEST2';           
    BEGIN
       /*some code*/
        return othervar;
    END;
    /
_

MY_FUNC2には次のような同義語があります。

_ CREATE OR REPLACE PUBLIC SYNONYM "MY_FUNC2" FOR "S2"."MY_FUNC2"
_

_MY_FUNC_はエラー付きでコンパイルします:

PLS-00302:コンポーネント「MY_FUNC2」を宣言する必要があります

私の関数が他のスキーマ(S1)にあり、それらがまったく同じ構造を持ち、シノニムがまったく同じ(ただしS1を指す)および_MY_FUNC_コンパイルされたときに、このエラーが発生する理由がわかりませんいいよ.

私はもともとこの関数と同義語を作成しませんでした。 S2で一部の特権が不足している可能性があるため、_MY_FUNC_は正常に機能しますか?

10
Dzyann

スキーマと同じ名前のオブジェクトがある場合、そのエラーが発生する可能性があります。例えば:

create sequence s2;

begin
  s2.a;
end;
/

ORA-06550: line 2, column 6:
PLS-00302: component 'A' must be declared
ORA-06550: line 2, column 3:
PL/SQL: Statement ignored

S2.MY_FUNC2を参照すると、オブジェクト名は解決されているため、S2をスキーマ名として評価しようとはしません。 MY_FUNC2として呼び出すだけで混乱は生じないため、動作します。

ドキュメント 名前解決の説明 。修飾オブジェクト名の最初の部分(ここではS2)は、現在のスキーマ上のオブジェクトとして評価されてから、別のスキーマとして評価されます。

シーケンスではない場合があります。他のオブジェクトは同じエラーを引き起こす可能性があります。データディクショナリを照会することにより、同じ名前のオブジェクトの存在を確認できます。

select owner, object_type, object_name
from all_objects
where object_name = 'S2';
16
Alex Poole

私は同じ問題を抱えていたのでここに来ました。
私にとって問題だったのは、プロシージャがパッケージ本体ではなくパッケージヘッダーで定義されていたことです。
BEGIN ENDステートメントを失って関数を実行していました。

7
Tenzin