2011-02-15 57 views
0

我有兩個表名爲 「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; 

在此先感謝

回答

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

編輯:正如傑弗裏·肯普指出,可以批量收集到一個關聯數組。

如果這是真正的代碼,而不僅僅是爲了學習,你應該在常規的SQL中做到這一點。 insert into ab(custno) select distinct cust_no from aa將比使用PL/SQL快得多。

+0

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

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的優勢最後是使用批量綁定數組完成插入操作,因此只有一個調用SQL引擎而不是每個記錄一個。

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;