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
相关产品推荐
相关产品推荐

