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

Python传入日期列表执行Oracle SQL报ORA-01036错误如何解决

Python操作Oracle执行日期查询报错ORA-01036的解决方法

错误根因

  • 绑定变量名不匹配:SQL语句声明的占位符为:date,但cursor.execute传参时使用的参数名是id,占位符与参数名必须完全一致才能完成变量绑定,这是触发ORA-01036的直接原因。
  • 日期传值不规范:传入的日期字符串自带额外单引号,且直接传递字符串依赖Oracle客户端的隐式日期转换规则,容易出现格式兼容问题。

修正代码

方案1:循环单条查询(兼容原有逻辑)

推荐直接使用Python原生日期类型传递参数,避免日期格式转换问题:

import cx_Oracle
from datetime import date

# 原有数据库连接逻辑保持不变
cursor = connection.cursor()
date_list = [date(2021, 12, 1), date(2021, 12, 2)]

# 占位符命名和后续传参保持一致
sql = "select * from table1 where datestamp = :input_date"

for item in date_list:
    cursor.execute(sql, input_date=item)
    res = cursor.fetchall()
    print(res)

如果你需要保留字符串格式的日期输入,可显式指定转换规则,避免隐式转换异常:

cursor = connection.cursor()
date_list = ["01-DEC-21", "02-DEC-21"]
# 显式指定日期格式和语言,避免环境差异导致报错
sql = "select * from table1 where datestamp = to_date(:input_date, 'DD-MON-RR', 'NLS_DATE_LANGUAGE = AMERICAN')"

for item in date_list:
    cursor.execute(sql, input_date=item)
    res = cursor.fetchall()
    print(res)

方案2:批量查询(效率更高,无需循环)

如果只需一次查询返回所有日期的匹配结果,可使用IN条件批量绑定:

from datetime import date

cursor = connection.cursor()
date_list = [date(2021, 12, 1), date(2021, 12, 2)]
# 自动生成对应数量的占位符
placeholders = ', '.join([f":d{i}" for i in range(len(date_list))])
sql = f"select * from table1 where datestamp in ({placeholders})"
# 构造参数字典
params = {f"d{i}": val for i, val in enumerate(date_list)}

cursor.execute(sql, params)
res = cursor.fetchall()
print(res)

内容的提问来源于stack exchange,提问作者Mark T

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 21:54:03