2012-04-14 7 views
1

私は、Oracle CURSORを使用して、1つのテーブルから別のテーブルに挿入する大量のレコードを繰り返し処理しています。私は挿入に非常に時間がかかることが分かった。 CURSORを使用せずに一括レコードを処理する別の方法はありますか? ここに私が行っている活動があります。バルク・レコードをoracle DBに挿入する別の方法は何ですか?

CURSOR FIRST_TAB(bu_emp_id IN Number) IS 
    SELECT * FROM FIRST_TABLE lst 
    where lst.emp_id = bu_emp_id; 

v_first FIRST_TAB%ROWTYPE; 

CURSOR SECOND_TAB(bu_emp_id IN Number) IS 
    SELECT * FROM SECOND_TABLE 2nd WHERE 2nd.emp_id= bu_emp_id; 

v_second SECOND_TAB%ROWTYPE; 

CURSOR THIRD_TAB(bu_emp_id IN Number) IS 
    SELECT * FROM THIRD_TABLE 3rd WHERE 3rd.emp_id = bu_emp_id; 

v_third THIRD_TAB%ROWTYPE; 
------------------------------------------------------------------------ 

open FIRST_TAB(bu_emp_id); 
    loop 
    fetch FIRST_TAB into r_first; 
    exit when FIRST_TAB %NOTFOUND; 

-- iNSERT STATEMENT------- 

    open SECOND_TAB(bu_emp_id); 
    loop 
     fetch SECOND_TAB into v_second; 
     exit when SECOND_TAB %NOTFOUND; 

-- iNSERT STATEMENT------- 

     open THIRD_TAB(bu_emp_id); 
     loop 
      fetch THIRD_TAB into v_third ; 
      exit when THIRD_TAB %NOTFOUND; 

-- iNSERT STATEMENT------- 

     end loop; 
     close THIRD_TAB; 
    end loop; 
    close SECOND_TAB; 
    end loop; 
    close FIRST_TAB; 
+1

コードをフォーマットしました。関連するセクションを強調表示し、質問の作成時に '{}'ボタンをクリックしてください。 – Ben

+1

'INSERT ... SELECT'はカーソルを使うよりもずっと速くなります。 –

+0

あなたは何をしようとしていますか?コードはまったく動作しません。数字で始まる名前は '' 2nd "'を使って明示的に扱われなければならず、最初のカーソルにはパラメータが必要だと思われますが、これは存在しません... a_horse_with_no_nameが示唆するように、単純な 'insert'を使うべきでしょう。 – Ben

答えて

3

真っ直ぐなSQLでやり方を見つけてください。あなたのデータがそのアプローチに役立つかどうかはあなたの例から明らかではありませんが、これを行うために努力しています。あなたは、エンジンの1つのステートメントですべてをやることを改善するつもりはありません。

関連する問題