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

