Oracle 尝试使用具有计数值的数据更新表

Posted

技术标签:

【中文标题】Oracle 尝试使用具有计数值的数据更新表【英文标题】:Oracle trying to update a table with data with a count values 【发布时间】:2018-10-11 06:58:46 【问题描述】:

下面的代码没有完成,因为我试图更新一个有 2500 000 行的表。 请查看下面的代码并告知可能是什么问题,以及如何提高性能以便完成更新。

开始

open C5_CUR;
loop
  FETCH C5_CUR
    into C5_ARRAY;
  exit when C5_CUR%notfound;

  open C4_CUR(C5_ARRAY.client_entity_number);
  loop
    FETCH C4_CUR
      into C4_array;
    exit when C4_CUR%notfound;

    update Wh_stg_clc.MARKETING_NEWSLETTER_REP n
       set n.family_count = C4_array.Family_Count
     where n.client_entity_number = C5_ARRAY.client_entity_number;
    dbms_output.put_line('Count has been updated');

   commit;

  end loop;
  close C4_CUR;

end loop;
commit;

【问题讨论】:

您所做的是重新发明嵌套循环连接,并逐行进行更新。正如 Littlefoot 在他们的回答中所说,您没有发布您的光标定义,因此我们很难给您一个具体的答案。我认为您可以使用单个 MERGE 语句轻松实现更新。为此,您需要连接两个游标 sql 语句以形成单个 sql 语句(提示,您的连接条件将是您使用 c5_cur.client_entity_number 过滤 c4_cur 的任何内容)。 简而言之,请提供两个游标定义,我们可以进一步帮助您。 【参考方案1】:

您没有发布游标声明。

无论如何:你在嵌套循环中做所有事情,在循环内提​​交。

首先,将COMMIT移出循环;在程序结束时留下一个 如果可能,在单个 SQL UPDATE 语句中完成所有操作,避免使用 PL/SQL

【讨论】:

以上是关于Oracle 尝试使用具有计数值的数据更新表的主要内容,如果未能解决你的问题,请参考以下文章

使用 PL/SQL 根据 Oracle SQL 中的父项更新子计数器

如何在 Asp.net MVC C# 中使用 Linq 从多个表中选择具有最大计数值的记录

基于匹配值的雪花SQL计数和从另一个表求和

Groupby - 具有重复值的熊猫 df 计数

使用同一表中另一列的数据计数更新一列? [关闭]

使用 JDBC 的 Oracle 临时表计数错误