programing

PLS-00302가 표시되는 이유: 구성 요소가 있을 때 선언되어야 합니까?

batch 2023. 6. 25. 18:34
반응형

PLS-00302가 표시되는 이유: 구성 요소가 있을 때 선언되어야 합니까?

Oracle 10.2를 사용하고 있습니다.

일부 Oracle 개체를 한 스키마(S1)에서 다른 스키마(S2)로 이동하기 위해 일부 스크립트에서 작업하고 있습니다.저는 DBA 역할로 기능을 만들고 있습니다.이동하면 제 기능 중 하나가 무효가 되는데, 왜 그런지 모르겠어요.코드는 다음과 같습니다.

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(); 대신에

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제대로 작동할 수 있습니까?

스키마와 이름이 같은 개체가 있으면 해당 오류가 발생할 수 있습니다.예:

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

저도 같은 문제가 있어서 왔습니다.
저에게 문제가 된 것은 절차가 패키지 본문에 정의되어 있지만 패키지 헤더에는 정의되어 있지 않다는 것입니다.
나는 BEGIN END 문을 잃어버린 채 내 기능을 실행하고 있었습니다.

언급URL : https://stackoverflow.com/questions/28706077/why-do-i-get-pls-00302-component-must-be-declared-when-it-exists

반응형