PL/SQL - 收集和记录
问题描述:
我有两个表名为 “AA” 和 “AB”PL/SQL - 收集和记录
- 在表中 “AA” 我有一个像CUST_NO,姓名,地址等栏目..
- 在表“AB”中,我有一列
cuno
我需要从“AA”表中取出cust_no并将其放入“AB”表的cuno列中。
我尝试了一些代码在这里...
declare
Type Ty_Handoff_Pc Is Table Of aa%Rowtype Index By Binary_Integer;
Type sam Is Table Of ab%rowtype;
l_pc Ty_Handoff_Pc;
l_ab sam;
begin
select distinct cust_no bulk collect into l_pc from aa;
for j in 1 .. 10 loop
l_ab(j) := l_pc(j).cust_no;
insert into ab values l_ab(j);
end loop;
end;
在此先感谢
答
不能批量收集到一个关联数组。您应该使用基于列类型而不是表格行类型定义的嵌套表格。
declare
type Ty_Handoff_Pc is table of aa.cust_no%type;
Type sam Is Table Of ab%rowtype;
l_pc Ty_Handoff_Pc;
begin
select distinct cust_no bulk collect into l_pc from aa;
for j in 1 .. l_pc.count loop
insert into ab values(l_pc(j));
end loop;
end;
/
编辑:正如杰弗里·肯普指出,可以批量收集到一个关联数组。
如果这是真正的代码,而不仅仅是为了学习,你应该在常规的SQL中做到这一点。 insert into ab(custno) select distinct cust_no from aa
将比使用PL/SQL快得多。
答
jonearles,是对的,最好的方法是使用常规的SQL - insert + select。
如果您有需要在PL/SQL一行一行地处理一些业务逻辑,但是,你可以使用你有什么略有不同的变体:
declare
Type Ty_Handoff_Pc Is Table Of aa%Rowtype Index By Binary_Integer;
Type sam Is Table Of ab%rowtype;
l_pc Ty_Handoff_Pc;
l_ab sam;
begin
select distinct cust_no bulk collect into l_pc from aa;
for j in 1 .. l_pc.count loop
l_ab(j).cuno := l_pc(j).cust_no;
-- perhaps some other processing here...
end loop;
FORALL i in 1..l_ab.count
insert into ab values l_ab(i);
end;
的FORALL的优势最后是使用批量绑定数组完成插入操作,因此只有一个调用SQL引擎而不是每个记录一个。
答
declare
type taba is recor(cust_no aa.cust_no%type);
type tabb is table of taba;
custno_t tabb;
begin
select cust_no bulk collect into custno_t from aa;
forall i in custno_t.first..custno_t.last
insert into bb values custno_t(i);
commit;
end;
Upvote for INSERT ... SELECT推荐 – 2011-03-30 05:12:48