Oracle,基于id克隆表中的行

时间:2013-12-05 22:19:08

标签: database oracle plsql

我有一堆表,其中包含Oracle DB中某些主表的外键。 在每个表中,主表中给定的id值有几行。

我的任务是为主表中的给定ID复制所有在其他表中引用该id的记录,但使用新的id值作为对主表的引用。

我已经编写了PL / SQL程序,它遍历每个表,并以最明显和最直接的方式完成所需的操作。但是,我想知道,这个问题更优雅的解决方案是什么?也许为一般案例编写一些通用程序,然后从我的主程序中为每个表调用它,或者可以在这里做更有效的事情?

2 个答案:

答案 0 :(得分:2)

“遍布每张桌子”并以“明显而直接的方式”运作的解决方案似乎很可能是最优雅的解决方案,至少对于大量问题而言。

如果您正在尝试构建通用实用程序,则可以执行以下操作:查询数据字典以获取与特定表相关的外键,并遍历树以查找子表,孙表等,并动态构建你想要的逻辑。然而,这将涉及一堆动态SQL,这意味着编写代码需要更长的时间,将来更难以阅读和修改,它可能会更慢,如果你将更加脆弱我们希望为不同的表设置不同的逻辑(例如,如果您希望以不同方式处理历史记录或审计表),或者您希望处理相关但未由外键强制执行的事务。如果您希望具有适用于许多不同基表的类似逻辑,或者您正在构建要与任意数据库一起使用的应用程序,则这些可能是可接受的权衡。如果您只是想在自定义系统中尝试使用一个或两个基表,那么它们可能是不可接受的权衡。

答案 1 :(得分:0)

以下解决方案最接近我的需求,并基于对this question的回答:

begin
FOR r IN (SELECT *
                  FROM table_name
                 WHERE fk_id = "old fk value")
      LOOP
         r.pk_id := pk_seq.NEXTVAL;
         r.fk_id := "new fk value";

         INSERT INTO table_name
              VALUES r ;
      END LOOP; 
end;