1. ホーム
  2. oracle

[解決済み] PLS-00302: component must be declared when it exists?」と表示されます。

2022-02-06 08:26:20

質問

Oracle10.2を使っています。

私は、あるスキーマ(S1)から別のスキーマ(S2)にいくつかのORACLEオブジェクトを移動するスクリプトで作業しています。 私は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();

マイ_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 は正常に動作するのでしょうか?

どのように解決するのですか?

スキーマと同じ名前のオブジェクトがある場合、このエラーが発生することがあります。たとえば、以下のような場合です。

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';