programing

PLS-00201: 식별자를 선언해야 합니다.

javajsp 2023. 3. 25. 09:52

PLS-00201: 식별자를 선언해야 합니다.

다음 테이블을 생성한 PL/SQL 스크립트를 실행했습니다.

TABLE_NAME VARCHAR2(30) := 'B2BOWNER.SSC_Page_Map';

인수를 사용하여 이 테이블에 대한 삽입 함수를 만들었습니다.

CREATE OR REPLACE FUNCTION F_SSC_Page_Map_Insert(
         p_page_id   IN B2BOWNER.SSC_Page_Map.Page_ID_NBR%TYPE, 
         p_page_type IN B2BOWNER.SSC_Page_Map.Page_Type%TYPE, 
         p_page_dcpn IN B2BOWNER.SSC_Page_Map.Page_Dcpn%TYPE)

신고해야 한다는 통보를 받았다.B2BOWNER.SSC_Page_Map내 기능에 대한 논쟁으로 보이기 전에 말이야이 에러가 발생하는 이유는 무엇입니까?

편집: 실제 오류

Warning: compiled but with compilation errors
Errors for FUNCTION F_SSC_PAGE_MAP_INSERT

LINE/COL ERROR                                                            
-------- -----------------------------------------------------------------
2/48     PLS-00201: identifier 'SSC_PAGE_MAP.PAGE_ID_NBR' must be declared
0/0      PL/SQL: Compilation unit analysis terminated 

편집: 완전한 PL/SQL 기능

RETURN INTEGER
IS
   TABLE_DOES_NOT_EXIST exception;  
   PRAGMA EXCEPTION_INIT(TABLE_DOES_NOT_EXIST, -942); -- ORA-00942

BEGIN

   INSERT INTO 
       B2BOWNER.SSC_Page_Map VALUES(
           p_page_id, 
           p_page_type, 
           p_page_dcpn);

   RETURN 0;

   EXCEPTION
       WHEN TABLE_DOES_NOT_EXIST THEN
           RETURN -1;
       WHEN DUP_VAL_ON_INDEX THEN
           RETURN -2;
       WHEN INVALID_NUMBER THEN
           RETURN -3;
       WHEN OTHERS THEN
           RETURN -4;
END;

SHOW ERRORS PROCEDURE F_SSC_Page_Map_Insert;

GRANT EXECUTE ON F_SSC_Page_Map_Insert TO B2B_USER_DBROLE; 
RETURN INTEGER

EDIT: 인수를 변경하고 insert 명령과 관련된 새 오류를 받았습니다.

CREATE OR REPLACE FUNCTION F_SSC_Page_Map_Insert(
                            p_page_id   IN INTEGER, 
                            p_page_type IN VARCHAR2, 
                            p_page_dcpn IN VARCHAR2)

RETURN INTEGER
IS

TABLE_DOES_NOT_EXIST exception;  
PRAGMA EXCEPTION_INIT(TABLE_DOES_NOT_EXIST, -942); -- ORA-00942

BEGIN

INSERT INTO 
    B2BOWNER.SSC_Page_Map VALUES(
        p_page_id, 
        p_page_type, 
        p_page_dcpn);

에러

Errors for FUNCTION F_SSC_PAGE_MAP_INSERT

LINE/COL ERROR                                                            
-------- -----------------------------------------------------------------
17/18    PL/SQL: ORA-00942: table or view does not exist                  
16/5     PL/SQL: SQL Statement ignored                                    

테이블이 올바른 스키마 내에서 올바른 속성 이름과 유형을 사용하여 확인되었습니다.

편집: 다음 명령을 실행하여 액세스 권한이 있는지 확인했습니다.

DECLARE
    count_this INTEGER;

BEGIN

select count(*) into count_this 
from all_tables 
where owner = 'B2BOWNER' 
and table_name = 'SSC_PAGE_MAP';

DBMS_OUTPUT.PUT_LINE(count_this);

END;

제가 받은 출력은

1
PL/SQL procedure successfully completed.

나는 그 테이블에 접근할 수 있다.

편집:

그래서 마침내 PL/SQL을 사용하여 스키마를 통해 테이블에 삽입을 진행했고 정상적으로 작동했습니다.단순히 기능을 만들 권한이 없는 것처럼 보이지만 그것은 가정입니다.

편집:

실제 테이블 DDL 문

 v_create := 'CREATE TABLE ' ||  TABLE_NAME || ' (
                PAGE_ID_NBR   NUMERIC(10)   NOT NULL Check(Page_ID_NBR > 0),
                PAGE_TYPE     VARCHAR2(50)  NOT NULL, 
                PAGE_DCPN     VARCHAR2(100) NOT NULL,
                PRIMARY KEY(Page_ID_NBR, Page_Type))';

EXECUTE IMMEDIATE v_create; 

COMMIT WORK;

COMMIT COMMENT 'Create Table'; 

테이블 작성 시B2BOWNERPL/SQL 함수 앞에 스키마 이름을 붙여야 합니다. B2BOWNER.F_SSC_Page_Map_Insert.

DBA가 지적할 때까지 몰랐습니다.root USER/SCHEMA 아래에 테이블을 만들 수 있었고 PL/SQL 기능은 정상적으로 작동했을 것입니다.

데이터베이스에 프로시저를 작성할 때는 프로시저 이름을 대문자로 입력해야 합니다.Java 클래스에서 호출할 때 절차 이름에 다음과 같은 작은 문자를 사용할 수 있습니다.

String getDBUSERByUserIdSql = "{call getDBUSERByUserId(?,?,?,?)}";

데이터베이스에서 절차 이름은 다음과 같아야 합니다.

GETDBUSERBYUSERID    -- (all letters in caps only)

이것은 이 문제의 해결 방법 중 하나입니다.

db에 대한 권한을 부여해야 합니다.

grant execute on (packageName or tableName) to user;

언급URL : https://stackoverflow.com/questions/23526870/pls-00201-identifier-must-be-declared