2011-05-03 47 views
-1

我具有以下表结构甲骨文 - 树 - PL/SQL - 复制用映射数据

ID Name Parent_ID 

1 abc 0 

2 efg 1 

3 hij 1 

4 klm 2 

5 nop 3 

等....在一个序列

我想要一个PL/SQL生成ID以忸怩在同一个表,但是这个ID相同的数据应该由序列生成和PARENT_ID应相应映射......这means..after PL/SQL它应该看起来像

ID Name Parent_ID 

1 abc 0 

2 efg 1 

3 hij 1 

4 klm 2 

5 nop 3 

6 abc 0 

7 efg 6 

8 hij 6 

9 klm 7 

10 nop 8 

可以ANY1帮我在这。 ..thnx

+1

我只能推断你想要重复第1到第6行。但是我不明白为什么要使用什么规则?说真的,试着把你的问题看作是一个只有你提供的有关你的任务的信息的人。你应该认识到,没有办法无意中想出正确的答案。 – 2011-05-03 10:14:23

+0

请发布您迄今为止编写的代码。人们通常不喜欢只为你写代码。事实上,这是一个工作描述,而不是一个问题。 – 2011-05-03 10:15:35

回答

1

所以,这里是你的原始数据:

SQL> select * from t23 
    2/

     ID NAM PARENT_ID 
---------- --- ---------- 
     1 abc   0 
     2 efg   1 
     3 hij   1 
     4 klm   2 
     5 nop   3 

SQL> 

此过程填充一个PL/SQL集合与现存行。它通过这些行循环,用一个由原始ID索引的新ID填充一个关联数组。 (请注意,赋值使用11g语法获取序列值,而不是从DUAL中选择传统)。然后将ID变为新值,并使用存储在关联数组中的值更新PARENT_ID。最后,新行被插入到表中使用大量FORALL语法,

SQL> declare 
    2  type num_lookup is table of pls_integer 
    3   index by pls_integer; 
    4  id_translate num_lookup; 
    5 
    6  type t23_nt is table of t23%rowtype; 
    7  new_rows t23_nt; 
    8 begin 
    9  select * 
10  bulk collect into new_rows 
11  from t23 
12  order by id asc; 
13 
14  for i in new_rows.first()..new_rows.last() 
15  loop 
16   id_translate(new_rows(i).id) := s23.nextval; 
17   new_rows(i).id := s23.currval; 
18   if new_rows(i).parent_id != 0 
19   then 
20    new_rows(i).parent_id := id_translate(new_rows(i).parent_id); 
21   end if; 
22  end loop; 
23 
24  forall j in new_rows.first()..new_rows.last() 
25   insert into t23 values new_rows(j); 
26 
27 end; 
28/

PL/SQL procedure successfully completed. 

SQL> 

而且,瞧!

SQL> select * from t23; 

     ID NAM PARENT_ID 
---------- --- ---------- 
     1 abc   0 
     2 efg   1 
     3 hij   1 
     4 klm   2 
     5 nop   3 
     6 abc   0 
     7 efg   6 
     8 hij   6 
     9 klm   7 
     10 nop   8 

10 rows selected. 

SQL>