You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oracle 19c动态DDL存储过程无法执行,报ORA-00904错误求助

问题解决:ORA-00904: "END_DATE": invalid identifier

错误原因

你编写的动态SQL中,begin_date和end_date作为存储过程的参数,在使用q'[]'原样引用字符串时,Oracle会将它们识别为表的列名而非存储过程参数,因此触发"无效标识符"的错误。

解决方案

方法一:使用绑定变量(推荐)

通过占位符:b1、:b2替代参数,再用USING子句传入存储过程参数,既安全(防止SQL注入)又能让Oracle正确解析参数:

CREATE OR REPLACE PROCEDURE ddl_sp (begin_date nvarchar2, end_date nvarchar2) AS
BEGIN
    EXECUTE IMMEDIATE q'[
    CREATE TABLE
            sao_eligible_members_tbl AS
    SELECT
        h.pay_order_date
        FROM
            clm_header_h h
        WHERE
            TO_CHAR( h.pay_order_date, 'YYYYMM' ) BETWEEN :b1 AND :b2
    ]' USING begin_date, end_date;
END ddl_sp;
/

BEGIN
    ddl_sp('202301', '202401');
END;
/

方法二:字符串拼接(不推荐,存在SQL注入风险)

将参数直接拼接到动态SQL字符串中,注意转义单引号:

CREATE OR REPLACE PROCEDURE ddl_sp (begin_date nvarchar2, end_date nvarchar2) AS
BEGIN
    EXECUTE IMMEDIATE '
    CREATE TABLE
            sao_eligible_members_tbl AS
    SELECT
        h.pay_order_date
        FROM
            clm_header_h h
        WHERE
            TO_CHAR( h.pay_order_date, ''YYYYMM'' ) BETWEEN ''' || begin_date || ''' AND ''' || end_date || '''
    ';
END ddl_sp;
/

BEGIN
    ddl_sp('202301', '202401');
END;
/

内容的提问来源于stack exchange,提问作者J. Sizzler

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 21:20:59