执行Oracle动态SQL创建表时遇ORA-00922与ORA-06512错误,求排查
错误原因及解决方案
核心问题
你的代码里to_char(current_date)未指定格式掩码,默认生成的日期字符串会包含空格、冒号等Oracle表名不允许的非法字符(比如cs_trassen_hists_09-10-2024 14:35:22),这直接违反了Oracle对象命名规则,触发ORA-00922错误;ORA-06512是错误栈信息,仅指向错误发生的行(EXECUTE IMMEDIATE语句),并非问题根源。
修正方案
给to_char指定不含非法字符的格式掩码,生成合法表名:
- 推荐纯数字格式(简洁无歧义):
DECLARE query clob; BEGIN query := 'create table cs_trassen_hists_' || to_char(current_date, 'YYYYMMDD') || ' as select * from cs_trassen_hist'; EXECUTE IMMEDIATE query; END;
- 也可使用下划线分隔的格式:
DECLARE query clob; BEGIN query := 'create table cs_trassen_hists_' || to_char(current_date, 'YYYY_MM_DD') || ' as select * from cs_trassen_hist'; EXECUTE IMMEDIATE query; END;
额外说明
如果非要使用包含空格/特殊字符的表名,必须用双引号包裹表名,但会强制区分大小写,后续所有操作该表都要带双引号,非常繁琐,不推荐这种写法。
内容的提问来源于stack exchange,提问作者Codernew
相关产品推荐
相关产品推荐

