Plsql 从上次选择时的先前参考开始

Plsql 从上次选择时的先前参考开始,plsql,Plsql,基于select查询插入时出现问题 我在数据库中有一个具有父子关系的模式,如下所示 A B C G L F C G L 注意元素c是如何重用的,因为它可以使用不同的父id保存两次,但是元素g只能保存一次,因为c的id在两种情况下都是相同的。select按预期使用以下查询打印所有内容 select id, parent_id, label from table start with parent_id is null c

基于select查询插入时出现问题

我在数据库中有一个具有父子关系的模式,如下所示

A
 B
  C
   G
    L
F
 C
  G
   L
注意元素c是如何重用的,因为它可以使用不同的父id保存两次,但是元素g只能保存一次,因为c的id在两种情况下都是相同的。select按预期使用以下查询打印所有内容

select  id,
        parent_id,
        label
from    table
start   with parent_id is null
connect by nocycle prior id = parent_id   
order   siblings by sort
我在这个表中有大约2500个元素,但最终显示了大约4000个元素,因为一些元素应该在不同的位置多次显示

因此,为了将第一个和第二个g都标识为唯一元素,我编写了以下insert语句

 insert into other_tale (id, parent_id, label)
 select create_id new_id, 
        prior ???,
        label,
 from   table
 start with parent_id is null
 connect by nocycle prior id = parent_id   
 order siblings by sort;
insert into other_tale (id, parent_id, label)
select my_package.f_generate_id(id), 
       my_package.f_generate_id(parent_id),
       label
...

在这里,我调用一个过程来为找到的每个raw生成一个新id。现在我被困在接收父元素的新id的部分。我知道我可以在being select表中引用先前的父元素,但我是否能够以某种方式引用select中父元素的new\u id列?

创建一个包含1个关联数组
id\u cache
和2个函数的包:
f\u clear\u cache
f\u generate\u id

f\u clear\u cache
删除缓存的id-
id\u cache.delete

f_generate_id
将id作为参数并返回新的_id

  • 检查是否已生成新的\u id-
    id\u缓存存在(id)
  • 如果没有,则生成新的\u id并将其缓存-
    id\u缓存(id):=new\u id
  • 返回新的\u id-
    返回id\u缓存(id)
  • 最后在sql语句中使用该函数

     insert into other_tale (id, parent_id, label)
     select create_id new_id, 
            prior ???,
            label,
     from   table
     start with parent_id is null
     connect by nocycle prior id = parent_id   
     order siblings by sort;
    
    insert into other_tale (id, parent_id, label)
    select my_package.f_generate_id(id), 
           my_package.f_generate_id(parent_id),
           label
    ...
    
    注意:如果要在同一会话中生成新的ID集,请不要忘记调用
    f\u clear\u cache