PL/SQL - 收集和记录

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快得多。

+0

Upvote for INSERT ... SELECT推荐 – 2011-03-30 05:12:48

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;