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

Python cx_Oracle实现用户日期输入对比PL/SQL的问题排查

解决cx_Oracle中用户输入日期查询的ORA-01841错误

ORA-01841错误的核心原因是日期字符串格式不匹配或SQL拼接导致的参数解析异常。PL/SQL中的&Enter_Date是直接变量替换,但Python中直接拼接用户输入的字符串到SQL语句里,不仅容易引发格式错误,还存在SQL注入风险。正确的做法是使用cx_Oracle的参数绑定机制,而非手动拼接SQL。

解决方案1:绑定字符串参数(保留TO_DATE转换)

直接将用户输入的日期字符串作为参数绑定到SQL中,让Oracle处理格式转换:

import cx_Oracle

# 获取用户输入
user_date = input("请输入日期(格式:YYYY-MM-DD):")

# 使用命名参数绑定,避免SQL拼接
sql = "SELECT * FROM X WHERE date_ = TO_DATE(:input_date, 'YYYY-MM-DD')"

# 建立连接并执行查询
with cx_Oracle.connect("用户名/密码@数据库地址") as conn:
    with conn.cursor() as cursor:
        cursor.execute(sql, input_date=user_date)
        for row in cursor:
            print(row)

解决方案2:转换为Python datetime对象(推荐)

将用户输入的字符串转换为Python datetime 对象后直接绑定,Oracle会自动处理日期类型映射,无需在SQL中使用TO_DATE:

import cx_Oracle
from datetime import datetime

# 获取用户输入并转换为datetime对象
user_input = input("请输入日期(格式:YYYY-MM-DD):")
try:
    date_obj = datetime.strptime(user_input, "%Y-%m-%d")
except ValueError:
    print("日期格式错误,请输入YYYY-MM-DD格式的日期")
    exit()

# 简化SQL语句,直接绑定日期对象
sql = "SELECT * FROM X WHERE date_ = :input_date"

# 执行查询
with cx_Oracle.connect("用户名/密码@数据库地址") as conn:
    with conn.cursor() as cursor:
        cursor.execute(sql, input_date=date_obj)
        results = cursor.fetchall()
        for row in results:
            print(row)

关键注意事项

  • 禁止直接拼接用户输入到SQL语句中,这会导致格式错误和SQL注入漏洞。
  • 对用户输入做格式校验,通过datetime.strptime捕获格式错误,提前提示用户修正。
  • 使用with语句管理数据库连接和游标,确保资源自动释放。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 17:18:10