pl / sql - 收集和记录

时间:2011-02-15 05:03:54

标签: oracle plsql

我有两个名为“AA”和“AB”的表

  • 在表“AA”中,我有像cust_no,name,address等的列。
  • 在表格“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;

感谢提前

3 个答案:

答案 0 :(得分:3)

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最后的优点是插件是使用批量in-bind数组完成的,所以每次只记录一次SQL引擎而不是每次记录。

答案 1 :(得分:2)

您无法批量收集到关联数组中。您应该使用基于列类型而不是表行类型定义的嵌套表。

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;
/

编辑:正如Jeffrey Kemp指出的那样,你可以批量收集到一个关联数组。

如果这是真正的代码,而不仅仅是学习,你肯定应该在常规SQL中进行。 insert into ab(custno) select distinct cust_no from aa比使用PL / SQL要快得多。

答案 2 :(得分:0)

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;