Python / cx_Oracle / Oracle 更新记录时出现挂起问题

问题描述 投票:0回答:1

我有一个Python类,使用cx_oracle在数据库中进行DML。例如类的方法:

def executesimple_dml(self, sql):
    self.cursor.execute(sql)
    self.connection.commit()

DML 适用于定义不带引号的列标题的表。但是,我有一个表,我必须使用区分大小写的带空格的列标题(用引号定义)

当我运行以下代码时,效果很好:

...
connector.executesimple_dml("update shssdalan_auto_que set action = 'test255' where sw_service_offering = 'SHS-MMSA.SDLAN.SK.BTS LB.WlanAP__w-sk-btslb-0-4-004_SW-SO' ")

但是当我运行这段代码时,它会永远运行而不会出现错误:

...
connector.executesimple_dml("""update ds_so set "Operation" = 'test3' where "Name" = 'SHS-MMSA.SDLAN.SK.BTS LB.WlanAP__w-sk-btslb-0-4-004_SW-SO'""")

在 Oracle 中,我们看到我的连接发送了正确的代码行,但其执行需要很长时间。当我直接在 Oracle SQL Developer 中运行相同的 DML 时,它会立即执行。 另外,我们注意到下划线会导致一些问题。例如,当我从条件('SHS-MMSA.SDLAN.SK.BTS LB.WlanAPw-sk-btslb-0-4-004SW-SO')中删除下划线时,它可以通过Python运行!

总而言之,只有一张用引号定义的表存在问题,仅使用Python代码,仅当where语句中包含下划线时才存在。当我使用具有相同下划线的类似代码来表示不同的表时,它工作得很好。我知道,这很奇怪...

它应该简单地处理 DML

python oracle cx-oracle dml
1个回答
1
投票

在 Oracle 中,我们看到我的连接发送了正确的代码行,但其执行需要很长时间。当我直接在 Oracle SQL Developer 中运行相同的 DML 时,它会立即执行。

您尝试修改的行可能已被 SQL Developer 会话锁定,但该会话尚未发出

UPDATE
COMMIT
,因此该行被锁定,而另一个会话正在等待锁定被释放。
尝试运行 Python 代码,如果代码“永远”等待,则转到 SQL Developer(或任何具有未提交数据的打开会话的工具)并运行 

ROLLBACK

(或

COMMIT
)命令并查看如果Python代码突然完成。如果是,那么它正在等待该行上的锁被释放。
    

© www.soinside.com 2019 - 2024. All rights reserved.