【问题标题】:how to update column in a oracle table and commit after each record update by using python and cx_Oracle如何使用 python 和 cx_Oracle 更新 oracle 表中的列并在每次记录更新后提交
【发布时间】:2019-03-16 17:55:41
【问题描述】:

在这里,我想批量更新记录。就像我的程序应该将初始 50k 记录更新为 null 并提交并更新每个记录。它应该再次选择下一个 50k 记录并执行相同操作。

>>> import cx_Oracle
>>> con = cx_Oracle.connect('ods/odss@dwdb3.test.com/DWdb3')
>>> cur = con.cursor()
>>> statement = ('UPDATE dumy_uvcredit set CCNUMBEREXT=null')
>>> cur.execute(statement)
>>> con.commit()

【问题讨论】:

  • 您想从 python 执行此操作并运行批量更新的任何具体原因?它看起来像一次更新操作。为什么不简单地运行一次语句呢?或者您可以查看用于此类批量更新的 ctas 技术asktom.oracle.com/pls/asktom/…
  • 这里我们的表中有大量数据,当我们通过触发 sql 语句一次性在任何列上运行更新语句时,它会创建巨大的日志文件,并且会在生产中的现有作业中产生问题。
  • 所以我想用python来做,只给commit的阈值50k。意味着代码将在50k之后执行语句并提交。这里我们没有任何标识符,只有3个需要从表中更新列。所有值都没有过滤器。
  • 是否有一些日期列可用于一次更新一周或一天一次?您可以在每次更新后提交。
  • 什么巨大的日志文件生产中现有工作存在什么问题?如果它少于一百万或两行,我会一次性完成更新,也许使用并行 DML 来加速它。如果您的数据库不能一次更新一百万行,那么您可能需要一台更好的笔记本电脑。

标签: python oracle oracle-sqldeveloper cx-oracle


【解决方案1】:

您是否可以使用以下方法

alter table dumy_uvcredit add  new_CCNUMBEREXT <the datatype of CCNUMBEREXT>;
alter table dumy_uvcredit rename column CCNUMBEREXT to old_CCNUMBEREXT;
alter table dumy_uvcredit rename column new_CCNUMBEREXT to CCNUMBEREXT;
alter table dumy_uvcredit SET UNUSED (old_CCNUMBEREXT);

dbms_redefinition 包可用于删除未使用的列,而不会干扰正在进行的操作

【讨论】:

  • 我希望 python 脚本将所有记录的列值更新为 null。更新将与记录 #>50000 一起提交。
  • 我明白,-使用我为您绘制的方法,您将获得相同的最终结果-我想我的建议将是 Oracle 推荐的方法-看看这个asktom.oracle.com/pls/asktom/…跨度>
  • 对于应该在事务中完成的事情,我通常不会推荐 DDL。这种方法会锁定整个表,会使现有代码失效,并且会在每一步之前和之后发出隐式提交,因此失败不会导致自动回滚。
  • @JeffreyKemp - 你对锁定的权利 - 但它会锁定表不到一秒钟。当您提到现有代码时 - 您是否知道它们具有将失效的现有代码 (PL/SQL)?他们是否有可能获得这样做的服务窗口。他们没有说任何关于上下文的内容——但对我来说,这似乎与清理不良数据有关。
猜你喜欢
  • 2015-02-12
  • 2022-01-16
  • 2021-02-16
  • 1970-01-01
  • 1970-01-01
  • 2018-11-07
  • 2015-07-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多