2011-05-03 42 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>