【问题标题】:PLS-00201 - identifier must be declaredPLS-00201 - 必须声明标识符
【发布时间】:2014-06-24 23:10:45
【问题描述】:

我执行了一个创建下表的 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

编辑:我更改了参数并收到与插入命令相关的新错误

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

【问题讨论】:

  • 您没有包含任何会导致该错误的代码。这使得确定您可能导致该错误的原因变得相当困难。您能否也请发布实际错误而不是您对它的解释?
  • @Ben 从发布的错误中可以看出,这确实是一个真正的问题
  • 我从不否认您遇到问题@Mushy,只是您没有提供足够的信息来解决问题。您发布的错误与所述的不同..它指出没有标识符SSC_PAGE_MAP.PAGE_ID_NBR。您是否验证了架构 `B2BOWNER` 中表 SSC_PAGE_MAP 上的列 PAGE_ID_NBR 存在,并且您能够在创建此函数的架构中从该表中进行选择?
  • @Ben 是的,在模式下验证为存在的表,可以作为 DDL 语句的目标,并且此类表的属性被验证为正确并与函数参数名称匹配。我能想到的唯一一件事是,如果以某种方式区分大小写,但我对此表示怀疑。
  • 对于原始错误,它只是看起来列名是错误的,正如已经建议的那样 - 从函数参数名称中,你说它与表列匹配,也许 _nbr 部分应该只是%type 不在那里,但只有你可以查询数据字典才能看到。对于后面的错误,听起来您对通过角色而不是直接授予您的用户的表授予的权限 - 在 PL/SQL 手册中查找authid

标签: oracle function plsql


【解决方案1】:

你应该给你的数据库权限

grant execute on (packageName or tableName) to user;

【讨论】:

  • 在我的情况下,我打错了,我写了declare INT mycount;,但它应该是declare mycount INT;
【解决方案2】:

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

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

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

GETDBUSERBYUSERID    -- (all letters in caps only)

这是解决此问题的方法之一。

【讨论】:

  • 我的 procs 混合了大小写名称 - 没问题。我遇到的问题是权限是按角色分配的,这是不允许的。
  • @Ruskin 是的,这也是我的答案。 grant execute on [package] to [some role that the user has] 引发编译错误,但 grant execute on [package] to [user] 编译正常。
  • 为什么这是公认的答案?是否有任何证据表明这甚至可能导致此错误?此外,OP 发布了他/她自己的不同答案。
  • 我同意杰伊·沙利文的观点。为什么这甚至是一个公认的答案。这没有任何意义。我闻到投票欺诈的味道了吗?
【解决方案3】:

B2BOWNER下创建TABLE时,一定要在PL/SQL函数前面加上Schema名称;即B2BOWNER.F_SSC_Page_Map_Insert

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-17
    • 2021-12-22
    • 2016-07-25
    • 2018-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多