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

Plsql Oracle正在尝试使用具有计数值的数据更新表,plsql,plsqldeveloper,plsql-package,Plsql,Plsqldeveloper,Plsql Package,下面的代码不完整,因为我正在尝试更新一个包含250000行的表。 请参阅下面的代码,并建议可能出现的问题,以及如何提高性能,以便完成更新 开始 您没有发布游标声明 不管怎样:你在嵌套循环中做每件事,在循环中前进 首先,将COMMIT从循环中移除;在程序结束时留下一个 如果可能,在单个SQLUPDATE语句中执行所有操作,避免使用PL/SQL 您没有发布游标声明 不管怎样:你在嵌套循环中做每件事,在循环中前进 首先,将COMMIT从循环中移除;在程序结束时留下一个 如果可能,在单个SQLUPD

下面的代码不完整,因为我正在尝试更新一个包含250000行的表。 请参阅下面的代码,并建议可能出现的问题,以及如何提高性能,以便完成更新

开始


您没有发布游标声明

不管怎样:你在嵌套循环中做每件事,在循环中前进

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

您没有发布游标声明

不管怎样:你在嵌套循环中做每件事,在循环中前进

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

您所做的是重新创建嵌套循环联接,再加上逐行更新。正如Littlefoot在回答中所说,您没有发布光标定义,因此我们很难给出具体的答案。我认为您可以通过使用单个MERGE语句轻松实现更新。为此,您需要连接两个游标sql语句以形成一个sql语句(提示,您的连接条件将是使用c5_cur.client_entity_编号过滤c4_cur的任何内容)。简而言之,请提供两个游标定义,我们可以进一步帮助您。您所做的是重新创建嵌套循环连接,再加上逐行更新。正如Littlefoot在回答中所说,您没有发布光标定义,因此我们很难给出具体的答案。我认为您可以通过使用单个MERGE语句轻松实现更新。为此,您需要将两个游标sql语句连接起来形成一个sql语句(提示,您的连接条件将是使用c5_cur.client_entity_编号筛选c4_cur的任何内容)。简而言之,请提供两个游标定义,我们可以进一步帮助您。
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;