Python操作Oracle建表时run_dt转Char及to_date报ORA-01861错误求助
问题原因
ORA-01861报错的核心是Oracle的to_date函数未显式指定格式掩码时,会默认读取数据库的NLS_DATE_FORMAT全局参数格式,你传入的YYYY-MM-DD格式字符串和数据库默认格式不匹配,导致解析失败。同时你原有SQL存在两处语法问题:一是关联条件里用了不存在的别名s(你定义的表别名是a和cd);二是CREATE TABLE接查询结果需要加AS关键字,你漏写了该关键字。
解决方案
方案1:显式指定to_date格式掩码(快速修复)
直接在to_date函数中声明传入字符串的日期格式即可,修改对应SQL片段为:
to_date('{run_dt}', 'YYYY-MM-DD') as max_upload_date,
同时修正关联条件和建表语法的错误:
cursor.execute(f'''create table taxes as select age, name, to_date('{run_dt}', 'YYYY-MM-DD') as max_upload_date from Employee a left outer join code cd on (a.emp_id = cd.code) and a.transaction_date = to_date('{run_dt}', 'YYYY-MM-DD') ''')
方案2:使用cx_Oracle参数绑定(更安全,推荐)
不推荐用f-string拼接SQL,既容易出现类型转换问题,也有SQL注入风险。使用cx_Oracle原生参数绑定可以自动处理日期类型转换,不需要手动转字符串、不需要调用to_date函数:
# 不需要把run_dt转为str,保留date类型即可 run_dt = execution_dt.date() cursor.execute(''' create table taxes as select age, name, :run_dt as max_upload_date from Employee a left outer join code cd on a.emp_id = cd.code and a.transaction_date = :run_dt ''', {"run_dt": run_dt})
参数绑定还能让Oracle复用SQL执行计划,执行效率更高。
内容的提问来源于stack exchange,提问作者Robby star
相关产品推荐
相关产品推荐

