Python连接Oracle实现Start_date/End_date自动化及ORA-00936报错求助
修复方案
错误原因
- SQL拼接时未给日期值加单引号,Oracle会把
05/01/2021识别为除法运算而非字符串参数,触发ORA-00936错误 - 直接拼接SQL存在SQL注入风险,且需要自行处理格式转义,容易出错
推荐写法(参数化查询,无需处理格式、引号问题)
你可以直接用pandas内置的参数传递功能,cx_Oracle驱动会自动适配Oracle的日期类型,无需手动写to_date转换:
import pandas as pd import cx_Oracle from datetime import datetime connstr = 'UN/PW@dbpath/DB' conn = cx_Oracle.connect(connstr) # 读取输入并转成datetime对象,提前校验日期格式合法性 start_date_str = input("Enter start_date in MM/DD/YYYY format :") start_date = datetime.strptime(start_date_str, "%m/%d/%Y") end_date_str = input("Enter end_date in MM/DD/YYYY format :") end_date = datetime.strptime(end_date_str, "%m/%d/%Y") print(start_date_str) print(end_date_str) # 用:1 :2作为位置占位符,params按顺序传参 df=pd.read_sql_query(""" select pr_no , pr_task_no , act_complete_date_time from pr_task where pr_task_no = 100 and act_complete_date_time between :1 and :2 """, conn, params=[start_date, end_date])
快速修复(仅解决当前报错,不推荐生产环境使用)
如果一定要用字符串拼接的写法,给日期参数加上单引号即可:
and act_complete_date_time between to_date('{start_date}','mm/dd/yyyy') and to_date('{end_date}','mm/dd/yyyy')
注意你原有代码中拆分month, year, day的两行代码没有实际使用,可以直接删除,代码中直接写死的05/01/2021、05/31/2021两行属于冗余代码,也需要删除,否则会被当做除法运算执行,没有实际作用。
内容的提问来源于stack exchange,提问作者L_10
相关产品推荐
相关产品推荐

