我在Oracle 11g和12c环境中工作。我需要创建一个执行以下操作的SP:
- 从两个表(加入)中读取数据
- 使用LIMIT
将BULK COLLECT提取到表格中
- 根据一些列中的内容,我可能需要在这些列中创建具有不同结果的重复记录。因此,一行可能最终成为具有不同日期和数量的两行
- 虽然这两行彼此之间是唯一的,但它现在可能会与我可能已处理或未处理的另一组数据发生冲突。这将导致我的目标表中出现重复的PK记录,因此,在插入目标表之前,我需要压缩并对整个数据集的qty字段(分组依据)求和
醇>
我开始只使用Cursor和BULK COLLECT编写一个带有LIMIT的嵌套表,但是,当然,我需要整个数据集来执行该组,所以我认为我需要将数据转储到全局临时表中已经完成了上面的第3步。但是,我已经添加了很多步骤来处理我的数据,而我现在又猜测了我应该如何做的想法。不知道我怎么做呢,因为我不能直接转储到GTT而不会丢失我正在处理的数据集的跟踪...除非我在GTT或其他东西添加一个音序器列......我想我可以。也许我在思考这个问题。我正在处理几十万条记录......可能会达到一百万。我也在寻找最好的表现。以下是潜在的新步骤:
- 光标c1从两个表(连接)中读取数据 - 因为我需要限制#fetched
- 使用LIMIT 1000
将BULK COLLECT提取到嵌套表中
- 根据一些列中的内容操作1000行数据并将它们插入到Collection中。如果结果符合某个标准,则将另一组数据插入到具有略微不同数据的集合中。该集合现在可以是> 1000行但不超过2000行
- 将该集合插入GTT。我认为这将是一个FORALL INSERT INTO gtt。
- 如果有更多记录要处理,请重复步骤2到4,直到c1%notfound
- FORALL使用GROUP BY将gtt表插入到目标表中以消除重复的PK记录......我认为我需要在较小的块中执行此操作吗?我是否使用rownum循环来读取/插入...不确定GTT的最佳实践是什么。
醇>
我建议最好,最快的方法。