所以,这里是你的原始数据:
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>
来源
2011-05-03 11:05:49
APC
我只能推断你想要重复第1到第6行。但是我不明白为什么要使用什么规则?说真的,试着把你的问题看作是一个只有你提供的有关你的任务的信息的人。你应该认识到,没有办法无意中想出正确的答案。 – 2011-05-03 10:14:23
请发布您迄今为止编写的代码。人们通常不喜欢只为你写代码。事实上,这是一个工作描述,而不是一个问题。 – 2011-05-03 10:15:35