【发布时间】: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执行