错误:PL/SQL:ORA-00904::标识符无效

Posted

技术标签:

【中文标题】错误:PL/SQL:ORA-00904::标识符无效【英文标题】:error:PL/SQL: ORA-00904: : invalid identifier 【发布时间】:2014-06-23 09:23:47 【问题描述】:
CREATE OR REPLACE PACKAGE pls_check2 AS
  PROCEDURE check_proc(p_item_cat       NUMBER,
                       p_sub_cat        NUMBER,
                       p_pack_is        NUMBER,
                       p_pack_name      NUMBER,
                       v1           OUT NUMBER,
                       v2           OUT NUMBER,
                       v3           OUT NUMBER,
                       v4           OUT NUMBER);

  PROCEDURE package_info1(param1 NUMBER, param2 NUMBER, param3 NUMBER);
END pls_check2;


CREATE OR REPLACE PACKAGE BODY pls_check2 AS
  v1  NUMBER;
  v2  NUMBER;
  v3  NUMBER;
  v4  NUMBER;

  PROCEDURE check_proc(p_item_cat       NUMBER,
                       p_sub_cat        NUMBER,
                       p_pack_is        NUMBER,
                       p_pack_name      NUMBER,
                       v1           OUT NUMBER,
                       v2           OUT NUMBER,
                       v3           OUT NUMBER,
                       v4           OUT NUMBER) IS
    CURSOR c1 IS
      SELECT ic.id
        FROM itemcategory ic
       WHERE ic.id = p_item_cat;
  BEGIN
    v1 := p_item_cat;
    v2 := p_sub_cat;
    v3 := p_pack_is;
    v4 := p_pack_name;

    FOR c_p IN c1 LOOP
      INSERT INTO master_product_table
        (SELECT NULL,
                NULL,
                package_info1(c_p.id, v2, v3)
           FROM package);
    END LOOP;

    DBMS_OUTPUT.put_line('hello');
  END;

  PROCEDURE package_info1(param1 NUMBER, param2 NUMBER, param3 NUMBER) IS
    v_is_incentivized  VARCHAR2(20);
  BEGIN
    SELECT is_incentivized
      INTO v_is_incentivized
      FROM package pk
     WHERE pk.id = 1;

    DBMS_OUTPUT.put_line('hi');
  END;
END pls_check2;

编译时出现以下错误:

Error(18,1): PL/SQL: SQL Statement ignored
Error(33,7): PL/SQL: ORA-00904: : invalid identifier   

【问题讨论】:

您有一个名为“package”的表。你不应该使用keywords as identifiers 哦,是的,我确实有一个名为 package 的表,它是业务需求,我无法更改它 当我检查代码似乎没问题时,这段代码仍然给我同样的错误。 @user3751229 这是一个非常愚蠢的业务需求。您不能告诉他们您需要为其添加前缀/后缀(例如,将其命名为TAB_PACKAGE)吗? 【参考方案1】:

您正尝试从 SQL 调用 PROCEDURE。这是不允许的(因为它真的没有意义)。将package_info1 更改为

function package_info1(param1 NUMBER, param2 NUMBER, param3 NUMBER)
    return number;

在包头和到

function package_info1(param1 NUMBER, param2 NUMBER, param3 NUMBER)
    return number IS
  v_is_incentivized  VARCHAR2(20);
  BEGIN
    SELECT is_incentivized
      INTO v_is_incentivized
      FROM package pk
     WHERE pk.id = 1;

    DBMS_OUTPUT.put_line('hi');
    RETURN 1;
  END;

在包体中,它会编译。不过,我真的建议您重命名您的 PACKAGE 表 - 该名称将给您带来无尽的痛苦。

【讨论】:

以上是关于错误:PL/SQL:ORA-00904::标识符无效的主要内容,如果未能解决你的问题,请参考以下文章

ORA-00904 PL/SQL 中的标识符无效

基本 Oracle 触发器审计表

ORA-00904 - 无效的标识符

ORA-00904 在 DATE 列上使用“MERGE INTO”和“SELECT FROM dual”时出现“无效标识符”错误

标识符过程无效

错误报告:SQL 错误:ORA-00904::无效标识符 00904。00000 - “%s:无效标识符”