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

Posted

技术标签:

【中文标题】ORA-00904 PL/SQL 中的标识符无效【英文标题】:ORA-00904 invalid identifier in PL/SQL 【发布时间】:2021-04-13 09:47:14 【问题描述】:
CREATE OR REPLACE PROCEDURE PURGE_PROGRAM
AS
BEGIN
   DECLARE
   v_param          VARCHAR2(3500);
   v_sql            VARCHAR2(500);
   v_purge_count    NUMBER(17);

  BEGIN
    SELECT param INTO v_param FROM PARAMETERS WHERE NAME='rententionPeriod';
    dbms_output.put_line('Param: '||v_param);

   IF v_param IS NOT NULL THEN
      SELECT COUNT(*) INTO  v_purge_count
      FROM
      (
         SELECT * FROM tbl1 WHERE TRUNC(SYSDATE) - TRUNC(UPDATE_DATE) > v_param
         UNION ALL
         SELECT * FROM tbl2 WHERE TRUNC(SYSDATE) - TRUNC(UPDATE_DATE) > v_param
      )x;

     v_sql := 'INSERT INTO tbl1_arc
               SELECT * FROM tbl1 WHERE TRUNC(SYSDATE) - TRUNC(UPDATE_DATE) > v_param';
EXECUTE IMMEDIATE v_sql;

     v_sql := 'INSERT INTO tbl2_arc
               SELECT * FROM tbl2 WHERE TRUNC(SYSDATE) - TRUNC(UPDATE_DATE) > v_param';
   EXECUTE IMMEDIATE v_sql;
   END IF;
  END;   
END PURGE_PROGRAM;
/

在上面的过程中,v_param 能够输出正确的值,但是随后我得到了异常ORA-00904: "V_PARAM": invalid identifier 也许 v_param 无法从字符串 v_sql 访问?

【问题讨论】:

您发布的代码doesn't throw that error。您是否可能试图在任何称呼中提及v_param;还是在您省略了代码中的(不必要的)内部块之后? 当我在需要执行的SQL字符串中引用v_param时,它必须是后面的代码,让我更新问题。 更新,v_param需要通过EXECUTE IMMEDIATE传递给v_sql执行 【参考方案1】:

当我在需要执行的SQL字符串中引用v_param时,一定是后面的代码

是的。 v_param 超出了您正在执行的动态 SQL 的范围。

您需要在动态 SQL 中使用绑定变量,并将值传入:

v_sql := 'INSERT INTO tbl1_arc
               SELECT * FROM tbl1 WHERE TRUNC(SYSDATE) - TRUNC(UPDATE_DATE) > :v_param';
EXECUTE IMMEDIATE v_sql USING v_param;

db<>fiddle


不直接相关,但比较前最好避免修改表列值;所以你可以这样做:

WHERE UPDATE_DATE > TRUNC(SYSDATE) - v_param

或者可能取决于您如何处理截止值 - 因此请检查返回哪些值以及您真正想要的值:

WHERE UPDATE_DATE >= TRUNC(SYSDATE) + 1 - v_param

这将允许使用UPDATE_DATE 上的索引,并且即使没有索引,总体工作量也会减少。

【讨论】:

谢谢,它返回了我真正想要的:WHERE UPDATE_DATE

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

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

ORA-00904 - 无效的标识符

标识符过程无效

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

基本 Oracle 触发器审计表

ORA-00904: 无效标识符 00904. 00000 - "%s: 无效标识符"