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

Oracle APEX(v20)下使用Python cx_Oracle更新当前时间戳失效问题

问题解决步骤

1. 核心问题:事务未提交

cx_Oracle默认关闭自动提交,执行UPDATE/INSERT等DML语句后,必须主动调用连接的commit()方法才能将修改持久化到数据库。你使用的SQL命令浏览器一般默认开启自动提交,所以相同语句直接运行可生效。
第一段代码修改后示例:

sql1 = 'SELECT * from ab.TEMPTABLE'
sql2 = 'UPDATE AB.CTIMEUPDATED SET TSTAMP = SYSTIMESTAMP'
try:
    connection = self.get_connection()
    with connection.cursor() as cursor:
        cursor.execute(sql2)
        # 执行DML语句后提交事务
        connection.commit()
        cursor.execute(sql1)
except Exception as e:
    # 异常时回滚避免脏数据
    connection.rollback()
    raise e

如果需要省去每次手动提交的操作,可在获取连接后开启自动提交:

connection.autocommit = True

2. 修正TIMESTAMP类型的写入写法

你不需要将Python datetime对象转为字符串再用TO_DATE转换,cx_Oracle原生支持Python datetime类型和Oracle TIMESTAMP类型的绑定,写法更简单也不会出现格式匹配错误。如果你不需要毫秒精度,直接把datetime对象的微秒属性置为0即可:

import datetime
import cx_Oracle

# 去掉微秒,仅保留年月日时分秒精度
d = datetime.datetime.now().replace(microsecond=0)
try:
    connection = self.get_connection()
    with connection.cursor() as cursor:
        # 直接传datetime对象即可,不需要额外格式转换
        cursor.execute(
            "INSERT INTO AB.CTIMEUPDATED(Tstamp) VALUES(:TS)",
            {"TS": d}
        )
        connection.commit()
except Exception as e:
    connection.rollback()
    raise e

3. 其他异常场景排查

如果提交事务后仍然不生效,可按以下顺序排查:

  • 确认Python代码使用的数据库账号和SQL客户端使用的账号一致,且拥有AB.CTIMEUPDATED表的UPDATE/INSERT权限
  • 执行DML语句后通过cursor.rowcount查看影响行数,验证UPDATE语句是否匹配到了要修改的记录
  • 确认没有其他会话的未提交事务锁住了CTIMEUPDATED表,导致你的修改一直处于等待状态

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 11:18:04