PLS-00201 - 必须声明标识符

Mus*_*shy 24 oracle plsql function

我执行了一个创建下表的PL/SQL脚本

TABLE_NAME VARCHAR2(30) := 'B2BOWNER.SSC_Page_Map';
Run Code Online (Sandbox Code Playgroud)

我使用参数为这个表创建了一个insert函数

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)
Run Code Online (Sandbox Code Playgroud)

我被通知我必须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 
Run Code Online (Sandbox Code Playgroud)

编辑:完整的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
Run Code Online (Sandbox Code Playgroud)

编辑:我更改参数并收到与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);
Run Code Online (Sandbox Code Playgroud)

错误

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                                    
Run Code Online (Sandbox Code Playgroud)

这些表已在正确的模式中验证,并具有正确的属性名称和类型

编辑:我执行以下命令来检查我是否有权访问

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;
Run Code Online (Sandbox Code Playgroud)

我收到的输出是

1
PL/SQL procedure successfully completed.
Run Code Online (Sandbox Code Playgroud)

我可以访问该表.

编辑:

所以我最终使用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'; 
Run Code Online (Sandbox Code Playgroud)

Mus*_*shy 7

在下创建TABLE时B2BOWNER,请确保在PL / SQL函数前加上Schema名称;即B2BOWNER.F_SSC_Page_Map_Insert

直到DBA指出这一点,我才意识到这一点。我可以在根USER / SCHEMA下创建该表,并且PL / SQL函数可以正常工作。


小智 5

在数据库中创建过程时,过程名称应为大写.从Java类调用时,您可以使用小写字母作为过程名称,如:

String getDBUSERByUserIdSql = "{call getDBUSERByUserId(?,?,?,?)}";
Run Code Online (Sandbox Code Playgroud)

在数据库中,过程的名称应该是:

GETDBUSERBYUSERID    -- (all letters in caps only)
Run Code Online (Sandbox Code Playgroud)

这是该问题的解决方案之一.

  • 我为我的触发器添加了混合的案例名称 - 没有问题.我所拥有的问题是由角色分配的,这是不允许的. (5认同)
  • 为什么这是公认的答案?有没有证据证明这甚至会导致这个错误?此外,OP发布了他/她自己的答案,这是不同的. (4认同)