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

