您的位置:首页 > 数据库 > Oracle

Oracle 复制指定Id下相关记录及其对应所有子表(包含子表的子表)下的记录

2015-05-04 13:24 267 查看
之前做PDM的时候,曾遇到过一个复制的业务需求,具体要求是根据顶层表的节点,复制其及其所有相关子表下的记录(当然主键不用复制),其实技术并不复杂,只是当时卡在了如何把复制过程中的一级级的新的父节点,传递到下一层的复制语句中(目前采用的是通过for 循环里的 变量关联起来)。表结构如下,都是1:N的关系,




代码如下:

CREATE OR REPLACE PROCEDURE P_COPYSUPPROINDEXALLCHILDS(supProIndexId VARCHAR2,
                                                       curUserId     VARCHAR2) IS
  v_nSupProIndexId    VARCHAR2(50);
  v_supProIndexDId    VARCHAR2(50);
  v_supProIndexContId VARCHAR2(50);
  v_subProIndexRuleId VARCHAR2(50);
BEGIN
  --复制监督加工打叶成品质量指标信息
  v_nSupProIndexId := F_COMMON_CREATEOBJID();
  Insert Into PDM_YLZJ_SUPPROINDEX
    (PDM_YLZJ_SUPPROINDEXID,
     CREATEDBY,
     CREATEDON,
     OWNINGUSER,
     OWNINGORGANIZATIONID,
     INDEXNO,
     INDEXNAME,
     YEARNO,
     ISENABLE,
     STARTTIME,
     ENDTIME,
     REMARK)
    Select v_nSupProIndexId,
           curUserId,
           sysdate,
           SP.OWNINGUSER,
           SP.OWNINGORGANIZATIONID,
           SP.INDEXNO,
           SP.INDEXNAME,
           SP.YEARNO,
           SP.ISENABLE,
           SP.STARTTIME,
           SP.ENDTIME,
           SP.REMARK
      From PDM_YLZJ_SUPPROINDEX SP
     Where PDM_YLZJ_SUPPROINDEXID = supProIndexId
       AND NVL(SP.ISDELETED, '0') = '0';

  --复制PDM_YLZJ_SUPPROINDEXD从表
  FOR i in (Select d.PDM_YLZJ_SUPPROINDEXDID
              From PDM_YLZJ_SUPPROINDEXD d
             Where d.PDM_YLZJ_SUPPROINDEXID = supProIndexId
               AND NVL(d.ISDELETED, 0) = 0) LOOP
    v_supProIndexDId := F_COMMON_CREATEOBJID();

    --复制PDM_YLZJ_SUPPROINDEXD
    Insert into PDM_YLZJ_SUPPROINDEXD
      (PDM_YLZJ_SUPPROINDEXDID,
       PDM_YLZJ_SUPPROINDEXID,
       CREATEDBY,
       CREATEDON,
       OWNINGUSER,
       OWNINGORGANIZATIONID,
       ARTIFACTTYPE,
       ISENABLE,
       ORDERNUM,
       REMARK,
       QUALITYITEMNO)
      Select v_supProIndexDId,
             v_nSupProIndexId,
             curUserId,
             sysdate,
             S.OWNINGUSER,
             S.OWNINGORGANIZATIONID,
             S.ARTIFACTTYPE,
             S.ISENABLE,
             S.ORDERNUM,
             S.REMARK,
             S.QUALITYITEMNO
        From PDM_YLZJ_SUPPROINDEXD S
       Where nvl(S.ISDELETED, '0') = '0'
         and S.PDM_YLZJ_SUPPROINDEXDID = i.PDM_YLZJ_SUPPROINDEXDID;
  --获取复制前对应的从表记录
    FOR j in (Select c.PDM_YLZJ_SUPPROINDEXCONTID
                From PDM_YLZJ_SUPPROINDEXCONT c
               Where c.PDM_YLZJ_SUPPROINDEXDID = i.PDM_YLZJ_SUPPROINDEXDID
                 AND NVL(c.ISDELETED, '0') = '0') LOOP

      --复制 PDM_YLZJ_SUPPROINDEXCONT
      v_supProIndexContId := F_COMMON_CREATEOBJID();

      Insert into PDM_YLZJ_SUPPROINDEXCONT
        (PDM_YLZJ_SUPPROINDEXCONTID,
         PDM_YLZJ_SUPPROINDEXDID,
         CREATEDBY,
         CREATEDON,
         OWNINGUSER,
         OWNINGORGANIZATIONID,
         TOBACCOTYPENO,
         QUALIFIEDRATIO,
         INDEXREQUEST,
         TESTCOMPAREOPERATOR1,
         TESTVALUE1,
         TESTCONDITIONOPERATOR,
         TESTCOMPAREOPERATOR2,
         TESTVALUE2,
         ISRULE)
        Select v_supProIndexContId,
               i.PDM_YLZJ_SUPPROINDEXDID,--把新的父Id传递到字表
               curUserId,
               sysdate,
               C.OWNINGUSER,
               C.OWNINGORGANIZATIONID,
               C.TOBACCOTYPENO,
               C.QUALIFIEDRATIO,
               C.INDEXREQUEST,
               C.TESTCOMPAREOPERATOR1,
               C.TESTVALUE1,
               C.TESTCONDITIONOPERATOR,
               C.TESTCOMPAREOPERATOR2,
               C.TESTVALUE2,
               C.ISRULE
          From PDM_YLZJ_SUPPROINDEXCONT C
         Where NVL(c.ISDELETED, '0') = '0'
           AND C.PDM_YLZJ_SUPPROINDEXCONTID = j.PDM_YLZJ_SUPPROINDEXCONTID;

      --复制PDM_YLZJ_SUPPROINDEXRULE
      FOR k in (Select r.PDM_YLZJ_SUPPROINDEXRULEID
                  From PDM_YLZJ_SUPPROINDEXRULE r
                 Where r.PDM_YLZJ_SUPPROINDEXCONTID =
                       j.PDM_YLZJ_SUPPROINDEXCONTID) LOOP

        v_subProIndexRuleId := F_COMMON_CREATEOBJID();

        Insert Into PDM_YLZJ_SUPPROINDEXRULE
          (PDM_YLZJ_SUPPROINDEXRULEID,
           CREATEDBY,
           CREATEDON,
           OWNINGUSER,
           OWNINGORGANIZATIONID,
           LEVELTYPE,
           TESTCOMPAREOPERATOR1,
           TESTVALUE1,
           PDM_YLZJ_SUPPROINDEXCONTID)
          Select v_subProIndexRuleId,
                 curUserId,
                 sysdate,
                 RU.OWNINGUSER,
                 RU.OWNINGORGANIZATIONID,
                 RU.LEVELTYPE,
                 RU.TESTCOMPAREOPERATOR1,
                 RU.TESTVALUE1,
                 j.PDM_YLZJ_SUPPROINDEXCONTID
            From PDM_YLZJ_SUPPROINDEXRULE RU
           Where RU.PDM_YLZJ_SUPPROINDEXRULEID =
                 k.PDM_YLZJ_SUPPROINDEXRULEID
             AND NVL(RU.ISDELETED, '0') = '0';
      END LOOP;

    END LOOP;

  END LOOP;
  COMMIT;
END P_COPYSUPPROINDEXALLCHILDS;


这个方案应该是最简单入门的处理逻辑吧,可是也是我目前想到的方案,若哪位大神有其他思路,还望不吝赐教!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐