You need to enable JavaScript to run this app. Python cx_Oracle按dd-mm-yyyy hh:mm:ss更新Oracle表日期报ORA-00933解决
优惠活动
大模型
产品
解决方案
定价
更多

Python cx_Oracle按dd-mm-yyyy hh:mm:ss更新Oracle表日期报ORA-00933解决

报错根因
  • 你当前代码直接把Python datetime对象转成字符串拼到SQL语句里,一方面生成的日期字符串格式不符合Oracle默认的日期解析规则,另一方面硬拼值的写法很容易因为值的特殊字符破坏SQL语法结构,最终触发ORA-00933: SQL command not properly ended的语法类报错。
  • Oracle的DATE类型为二进制存储结构,本身不绑定显示格式,你需要的dd-mm-yyyy hh:mm:ss是日期值的格式要求,不需要把值当字符串存入字段。
  • 直接硬拼SQL值的写法本身存在SQL注入风险,cx_Oracle原生支持参数绑定能力,完全不需要硬拼业务值。
正确实现方式

方案1:依赖驱动自动类型映射(最稳定)

cx_Oracle会自动把传入的Python datetime对象映射为Oracle的DATE类型,不需要手动转字符串,是最推荐的写法:

import cx_Oracle
import datetime

# 替换为你现有的连接、游标初始化逻辑
connection = cx_Oracle.connect("用户名/密码@数据库地址:端口/服务名")
cursor = connection.cursor()

sql = """
UPDATE a_table
SET COMPLETION_DATE = :target_completion_dt
WHERE ID = :target_id
"""
# 通过参数绑定传值,不要硬拼进SQL字符串
cursor.execute(
    sql,
    target_completion_dt=datetime.datetime.now(), # 自动保留到秒级精度,完全匹配格式要求
    target_id=1
)
connection.commit() # 必须手动提交,cx_Oracle默认关闭自动提交

方案2:SQL层显式做格式转换(匹配自定义格式要求)

如果需要在SQL层严格按照dd-mm-yyyy hh:mm:ss的规则做日期解析,可以借助Oracle内置的TO_DATE函数完成类型转换:

sql = """
UPDATE a_table
SET COMPLETION_DATE = TO_DATE(:dt_string, 'dd-mm-yyyy hh24:mi:ss')
WHERE ID = :target_id
"""
# 提前把Python当前时间按要求格式转成字符串,通过参数传入
current_dt_string = datetime.datetime.now().strftime('%d-%m-%Y %H:%M:%S')
cursor.execute(
    sql,
    dt_string=current_dt_string,
    target_id=1
)
connection.commit()
关键注意点
  • 不要将Python datetime对象直接通过f-string拼到SQL语句中,除了格式不匹配的问题,带特殊字符的字符串很容易触发各类语法类报错。
  • 执行UPDATE操作后必须调用connection.commit(),否则数据修改不会真正落库。
  • 如果后续查询该字段时,需要默认以dd-mm-yyyy hh:mm:ss格式返回,可以在会话初始化时设置NLS_DATE_FORMAT参数,或者查询时通过TO_CHAR(COMPLETION_DATE, 'dd-mm-yyyy hh24:mi:ss')做格式转换,不需要修改字段存储类型。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.13 04:24:00