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;
这个方案应该是最简单入门的处理逻辑吧,可是也是我目前想到的方案,若哪位大神有其他思路,还望不吝赐教!
相关文章推荐
- Oracle生成查询包含指定字段名对应的所有数据表记录语句
- Oracle生成查询包含指定字段名对应的所有数据表记录语句
- 根据指定ID,返回包含该ID的所有父级记录
- Oracle生成查询包括对应于所有数据表记录语句中指定的字段名
- 映射Hibernate如果指定了column的相关属性,则name属性必需.id如果没有配置name与属性对应,则取不出id
- Jquery :动态给Table指定行或尾行插入tr和相关,遍历页面所有控件获取id
- SqlServer:获取指定分类Id及其下属的所有子分类Id
- c#将一个文件夹及其里面的所有内容(文件和文件夹)复制到指定路径
- SQL 查询数据库中包含指定字符串的相关表和相关记录
- oracle 强制删除指定schema及相关的所有数据库的对象
- 编写文件搜索小程序:1. 输入绝对路径以及搜索关键字,2. 搜索指定路径下(包括子文件夹)中名称包含关键字的所有文件并打印出,3. 将当前操作记录日志
- Linux查找当前目录及其子目录下所有包含指定字符串的文件
- 复制指定节点及其所有子节点到指定结点的处理示例
- oracle删除表空间中一用户及其对应的所有数据
- java在指定路径下查找所有文件及其子文件名中,是否包含指定查询的关键字
- 复制指定节点及其所有子节点到指定结点的处理示例(借鉴方式排序法).sql
- Python_删除/创建指定目录及其下所有子目录的文件,该文件记录当前文件夹的内容
- 复制指定文件夹(包含所有子文件和子文件夹)
- Oracle中使用游标获取指定数据表的所有字段名对应的字符串
- Python_删除/创建指定目录及其下所有子目录的文件,该文件记录当前文件夹的内容