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

Python使用cx_Oracle更新带引号列的Oracle记录时挂起问题

问题解决:cx_Oracle执行带引号列+下划线条件的DML时性能异常

问题场景

使用cx_Oracle编写的Python类执行DML操作,核心代码如下:

def executesimple_dml(self, sql):
    self.cursor.execute(sql)
    self.connection.commit()
  • 列名未加引号的普通表,DML执行完全正常;
  • 针对带空格的大小写敏感列(定义时加引号)的表:
    • 执行不带下划线条件的DML无异常;
    • 执行带下划线条件的DML时,Python端无限运行无报错,Oracle端可见SQL已发送但耗时极久,相同SQL在Oracle SQL Developer中可立即完成;
    • 移除WHERE条件中的下划线后,Python端执行恢复正常。

解决方案

核心问题在于直接拼接SQL字符串导致Oracle优化器无法生成最优执行计划,改用绑定变量即可解决,同时还能避免SQL注入风险。

修改后的代码实现

调整executesimple_dml方法支持绑定变量传入:

def executesimple_dml(self, sql, params=None):
    params = params or {}
    self.cursor.execute(sql, params)
    self.connection.commit()

调用示例

执行目标DML时,用占位符替代直接拼接的字符串值:

sql = """update ds_so set "Operation" = :operation_val where "Name" = :name_val"""
connector.executesimple_dml(
    sql, 
    {
        "operation_val": "test3",
        "name_val": "SHS-MMSA.SDLAN.SK.BTS LB.WlanAP__w-sk-btslb-0-4-004_SW-SO"
    }
)

补充排查点

  1. 对比执行计划:检查Python端和SQL Developer端的Oracle执行计划,确认是否存在全表扫描等低效操作;
  2. 验证引号匹配:确保带引号的列名、表名与数据库定义完全一致(大小写敏感);
  3. 更新统计信息:执行ANALYZE TABLE ds_so COMPUTE STATISTICS;,确保Oracle优化器拥有最新的表统计数据。

内容的提问来源于stack exchange,提问作者Mateusz Topoliński

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 23:52:49