2012-01-23 10 views
1

その可能ならば、誰もが次のコードからの一括挿入を使用することを知っています:私はachieeveしようとしています何配列からテーブルPLSQLへの一括挿入?

FORALL I IN IBT_KONTIDS.FIRST .. IBT_KONTIDS.LAST 
    INSERT INTO EX_TABLE VALUES (IBT_KONTIDS(I), IBT_PROJNUMS(I), CURRENTUSER, SYSDATE); 

は私の2つの配列とのuserinfoや現在の時刻などの追加パラメータからEX_TABLEに速いインサートです。前もって感謝します !

+0

試しましたか? –

+0

ええと、そのコードは*一括挿入です。 –

答えて

3

私はそうは思わない。しかし、たとえあなたがなぜそうしたいと思うことができたとしても?あなたはおそらく私が名付けることができるよりも多くのトラブルを求めています。 2つの配列のレコード数が同じでないとどうなりますか?アレイに別の順序で収集された場合はどうなりますか?

ジョインを使用して、すべてを1つのカーソルに集めて挿入するのはなぜですか?

SQL> 
SQL> create table blah as 
    2 select a.* 
    3  , cast(null as varchar2(30)) as usr 
    4  , cast(null as date) as dt 
    5  , cast(null as varchar2(30)) as object_name 
    6  from user_tables a 
    7 where 1 = 0; 

Table created. 

SQL> 
SQL> declare 
    2 
    3 cursor c_tab is 
    4  select a.*, user, sysdate, b.object_name 
    5  from user_tables a 
    6  join user_objects b 
    7   on a.table_name = b.object_name 
    8   ; 
    9 
10 type t__tab is table of c_tab%rowtype index by binary_integer; 
11 t_tab t__tab; 
12 
13 begin 
14 
15  open c_tab; 
16 
17  loop 
18  fetch c_tab bulk collect 
19  into t_tab limit 1000; 
20 
21  exit when t_tab.count = 0; 
22 
23  forall ii in t_tab.first .. t_tab.last 
24   insert into blah 
25   values t_tab(ii) 
26    ; 
27 
28  commit; 
29 
30  end loop; 
31 
32  close c_tab; 
33 
34 end; 
35/

PL/SQL procedure successfully completed. 

SQL> 
+0

偉大な情報ベンしかし、正確に私が探していた私の以前の投稿[リンク](http://stackoverflow.com/questions/8962875/increase-performance-on-insert-cursor)あなたは、私はデータをフェッチし、私の配列を埋めるためにループで動的SQLを使用することを確認します。私はテーブルに1行ずつ挿入するのを避けたい。代わりに、私は私の配列を埋め込みバルクからデスティネーションテーブルとして使用する予定でした。これが正しい方法であるかどうかは分かりませんか? – Haris

+0

@ハリス、そ​​れは '一括収集...'の美しさです。行ごとに行を挿入しません。 DML操作は1つしかありません。パフォーマンスが大幅に向上した理由の1つです。 'ref_cursor'の行型を作成することは可能かもしれません - 私は試みたことがありません。その場合、' bulk collect'は引き続き動作しますが、非常に複雑なルートを下っているようです。それは本当に動的でなければならないのですか? – Ben

+0

あなたは正しいですベン、私はtottalyあなたに同意する、私はコードがすでに他の人によってその方法で書かれているので、動的plsqlに関する多くの選択肢がありません、その少し複雑です。私は挿入問題を解決しようとしています。実際の問題は、ループが毎回1行挿入を実行するため、挿入するデータが十分にある場合に発生します。 – Haris

関連する問題