批量收集到全局临时表

时间:2016-02-19 17:23:18

标签: plsql plsqldeveloper

我在Oracle 11g和12c环境中工作。我需要创建一个执行以下操作的SP:

  1. 从两个表(加入)中读取数据
  2. 使用LIMIT
  3. 将BULK COLLECT提取到表格中
  4. 根据一些列中的内容,我可能需要在这些列中创建具有不同结果的重复记录。因此,一行可能最终成为具有不同日期和数量的两行
  5. 虽然这两行彼此之间是唯一的,但它现在可能会与我可能已处理或未处理的另一组数据发生冲突。这将导致我的目标表中出现重复的PK记录,因此,在插入目标表之前,我需要压缩并对整个数据集的qty字段(分组依据)求和
  6. 我开始只使用Cursor和BULK COLLECT编写一个带有LIMIT的嵌套表,但是,当然,我需要整个数据集来执行该组,所以我认为我需要将数据转储到全局临时表中已经完成了上面的第3步。但是,我已经添加了很多步骤来处理我的数据,而我现在又猜测了我应该如何做的想法。不知道我怎么做呢,因为我不能直接转储到GTT而不会丢失我正在处理的数据集的跟踪...除非我在GTT或其他东西添加一个音序器列......我想我可以。也许我在思考这个问题。我正在处理几十万条记录......可能会达到一百万。我也在寻找最好的表现。以下是潜在的新步骤:

    1. 光标c1从两个表(连接)中读取数据 - 因为我需要限制#fetched
    2. 使用LIMIT 1000
    3. 将BULK COLLECT提取到嵌套表中
    4. 根据一些列中的内容操作1000行数据并将它们插入到Collection中。如果结果符合某个标准,则将另一组数据插入到具有略微不同数据的集合中。该集合现在可以是> 1000行但不超过2000行
    5. 将该集合插入GTT。我认为这将是一个FORALL INSERT INTO gtt。
    6. 如果有更多记录要处理,请重复步骤2到4,直到c1%notfound
    7. FORALL使用GROUP BY将gtt表插入到目标表中以消除重复的PK记录......我认为我需要在较小的块中执行此操作吗?我是否使用rownum循环来读取/插入...不确定GTT的最佳实践是什么。
    8. 我建议最好,最快的方法。

0 个答案:

没有答案