2016-09-13 20 views
-1

pl/sqlでバルク挿入の場合はFORALLを使用してこのようにすることはできますか?PL/SQLのFORALLループ内に挿入

TYPE c_type1 IS RECORD 
(
column1 table1.column1%TYPE, 
column2 table1.column2%TYPE, 
client table2.client%TYPE 
); 
type1 c_type1; 

CURSOR cur_t IS select * BULK COLLECT INTO recs from table3 ; 

begin 
    FOR recs IN cur_t 
    LOOP 

    SELECT * INTO type1 FROM (select a.column1, a.column2,imm.client 
    ... 
    from table1 a, table2 imm   
    WHERE 
    a.column1 = recs.column1 
) WHERE ROWNUM=1; 

    INSERT INTO table2 values (recs.column1,type1.column2); 

    ... 

P.S:挿入する列が80以上あります。

+0

このようにforallを使用できます。 http://psoug.org/snippet/FORALL-Insert_499.htm – XING

+0

..INSERT INTO table2値(recs.column1、type1.column2)に気付いた場合、@XING;私は2つのテーブルからレコードを挿入する必要があります。 –

+0

Whats Table 3 use..Whyループを実行しています。質問は明確ではありません。テーブル命名は適切ではありません – XING

答えて

0

あなたの質問はかなり明確ではありませんが、あなたのコードを見て、私は以下を持っています。これがあなたが探していたものかどうか確認してください。

declare 

CURSOR cur_t IS 
       select t3.column1 , t1.column2 
       from table3 t3 
       inner join table1 t1 
       on t3.column1 = t1.column1; 

type var_cur is table of cur_t%rowtype; 

var var_cur; 

begin 

open cur_t; 

    LOOP 

    FETCH cur_t bulk collect into var limit 100;  
    EXIT WHEN cur_t%NOTFOUND; 

    FORALL i IN 1 .. var.count SAVE EXCEPTIONS 
     INSERT INTO TABLE2 
    VALUES var(i);   

    END LOOP; 

    CLOSE distinctUserIdCursor; 

COMMIT; 

EXCEPTION 
    WHEN OTHERS THEN 
     dbms_output.put_line('Error in Insertion of record' || '~~~~' || SQLERRM); 
     FOR indx IN 1 .. SQL%BULK_EXCEPTIONS.COUNT 
     LOOP 
      DBMS_OUTPUT.put_line (SQL%BULK_EXCEPTIONS (indx).ERROR_INDEX|| ': ' 
       || SQL%BULK_EXCEPTIONS (indx).ERROR_CODE); 
     END LOOP; 

end; 
+0

タイプ1のrecsの一致するレコードごとに。レコードは1つだけでなければなりません。内部結合は2つのエントリを作成することができます** a.column1 = recs.column1 )WHERE ROWNUM = 1; ** –

+0

Okay..the skeletonあなたのロジックを実装してください。私はそれがうまくいくことを望む。私はforallを使う方法を説明しました。 – XING

関連する問題