Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle PL/SQL:使用表A的聚合数据更新表B_Oracle_Bulk - Fatal编程技术网

Oracle PL/SQL:使用表A的聚合数据更新表B

Oracle PL/SQL:使用表A的聚合数据更新表B,oracle,bulk,Oracle,Bulk,请假设您有一个Oracle表,表A,如下所示: 此表中的主要字段为字段1和字段2。你可以看到: a) 对于夫妇(AAA,1),我们有两个值:200.03和100.02; b) 对于耦合(BBB,3),我们有两个值:300.04和400.05 我们希望进行如下汇总,更新下表: 在表B的字段3中,我们希望存储关于夫妇的200.03和100.02之和(AAA,1),并且我们希望存储关于夫妇的300.04和400.05之和(BBB,3) 请想象一下,我们可能会有许多不同的夫妇: (ZZZ,77) (

请假设您有一个Oracle表,表A,如下所示:

此表中的主要字段为字段1和字段2。你可以看到:

a) 对于夫妇(AAA,1),我们有两个值:200.03和100.02; b) 对于耦合(BBB,3),我们有两个值:300.04和400.05

我们希望进行如下汇总,更新下表:

在表B的字段3中,我们希望存储关于夫妇的200.03和100.02之和(AAA,1),并且我们希望存储关于夫妇的300.04和400.05之和(BBB,3)

请想象一下,我们可能会有许多不同的夫妇: (ZZZ,77) (YYY,12) ... 等等

请假设引用一对夫妇的记录可能多于两个,在这种情况下,我们应该将关于同一对夫妇的所有记录的值相加

在我们的简单案例中,结果如下:

实际案例中有一个表a,其中包含大约2000万条记录,因此我想使用批量收集、更新和FORALL以PL/SQL编写软件

最好的方法是什么?请提供PL/SQL代码以解释如何解决该问题


非常感谢您考虑我的请求。

坦率地说,我不会在这里使用批量收集和FORALL-我会使用合并语句。试试像这样的东西

MERGE INTO TABLE_B b
  USING (SELECT FIELD1, FIELD2, SUM(FIELD3) AS TOTAL_FIELD3
           FROM TABLE_A
           GROUP BY FIELD1, FIELD2) a
    ON (b.FIELD1 = a.FIELD1 AND
        b.FIELD2 = a.FIELD2)
WHEN NOT MATCHED THEN
   INSERT (FIELD1, FIELD2, FIELD3)
     VALUES (a.FIELD1, a.FIELD2, a.TOTAL_FIELD3)
WHEN MATCHED THEN
   UPDATE
     SET FIELD3 = a.TOTAL_FIELD3;

祝你好运。

坦白地说,我不会在这里使用批量收集和FORALL-我会使用MERGE语句。试试像这样的东西

MERGE INTO TABLE_B b
  USING (SELECT FIELD1, FIELD2, SUM(FIELD3) AS TOTAL_FIELD3
           FROM TABLE_A
           GROUP BY FIELD1, FIELD2) a
    ON (b.FIELD1 = a.FIELD1 AND
        b.FIELD2 = a.FIELD2)
WHEN NOT MATCHED THEN
   INSERT (FIELD1, FIELD2, FIELD3)
     VALUES (a.FIELD1, a.FIELD2, a.TOTAL_FIELD3)
WHEN MATCHED THEN
   UPDATE
     SET FIELD3 = a.TOTAL_FIELD3;

祝你好运。

删除了一半的书面答案,只是更新了Bob的答案,但我从互联网上了解到,对于大型表格,合并起来并不方便。。。。。!我已经指定我们有两千万条记录,因此在一次交易中不可能更新两千万条记录。。。。!因此,采用批量收集的方法,更新和FORALL更方便。您最好弄清楚如何将数据子集到足够小的组中,以便使用合并,而不是通过将大容量收集到一个集合中,然后在这个相当大的数据集合中进行迭代,将价值2000万行的数据读入PL/SQL内存。祝你好运。当然,为了避免同时阅读2000万行,我打算在“限制”条款中加入“批量收集”。删除一半的书面答案,只是更新Bob’s-instead的投票。但我从互联网上了解到,对于大型表格,合并不方便。。。。。!我已经指定我们有两千万条记录,因此在一次交易中不可能更新两千万条记录。。。。!因此,采用批量收集的方法,更新和FORALL更方便。您最好弄清楚如何将数据子集到足够小的组中,以便使用合并,而不是通过将大容量收集到一个集合中,然后在这个相当大的数据集合中进行迭代,将价值2000万行的数据读入PL/SQL内存。祝你好运。当然,为了避免同时阅读2000万行,我打算用“限制”条款来“批量收集”。