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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 19:24:02