同时更新两个表 - Oracle

jim*_*man 5 oracle

假设我有两个表,例如:

Product
prd_id   prd_name   parent_prd_id  ...
123      Foo        <null>
456      Bar        <null>
789      Baz        <null>


Product_Parent_Relation_Batch
prd_id   prd_parent_id   processed
555      888             T
123      789             F
456      789             F
Run Code Online (Sandbox Code Playgroud)

我无法将关系数据直接加载到产品中。父母有可能在孩子之前不存在。不管设计是否糟糕,事情就是这样。要更新产品表,我会进行相关更新,例如:

Oracle SQL:使用另一个表中的数据更新表

我想用父 ID 789 填充产品 123 和 456,并将 123 和 456 设置为产品父关系批处理表中的processed = 'T'。看来我只能做一件事了。

我是否被迫在应用程序中执行此操作,在该应用程序中查询与现有产品记录具有匹配的 prd_id 的所有未处理的批记录,为产品表执行一个单独的更新语句,为关系批处理表执行另一个更新语句,对于所有适用记录?

CREATE OR REPLACE PROCEDURE sync_prd_with_parent
IS
   cursor c1 is
     select prd_id, parent_prd_id
     from product_parent_relation_batch
     inner join product on product_parent_relation_batch.prd_id = product.prd_id
     where product_parent_relation_batch.processed = 'F';
BEGIN
   FOR rec in c1
   LOOP
      UPDATE product SET parent_prd_id = rec.parent_prd_id WHERE prd_id = rec.prd_id;
      UPDATE product_parent_relation_batch SET processed = 'T' WHERE product_parent_relation_batch.prd_id= rec.prd_id;
   END LOOP;
END;
Run Code Online (Sandbox Code Playgroud)

除非发布更好的建议,否则我将满足于上述 PL/SQL 程序。

jim*_*man 4

在同一查询中更新多个表受到物理限制。

这种情况的可行解决方案是创建一个应用程序(PL/SQL 或其他应用程序)来获取需要更新的两个表的信息,迭代结果,并在每次迭代中更新各个语句中的表。