2012-04-14 21 views
1

我正在使用oracle CURSOR來迭代大量記錄從一個表插入到另一個表。我發現插入需要很長時間。有沒有其他方法可以在不使用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 2012-04-14 12:37:45

+1

「INSERT ... SELECT」比使用遊標要快得多。 – 2012-04-14 12:39:17

+0

你想做什麼?你的代碼根本無法工作。以數字開頭的名稱必須使用「2nd」明確地包含在內,而第一個遊標似乎需要一個參數,但這不存在......正如a_horse_with_no_name建議您應該使用簡單的'insert'。 – Ben 2012-04-14 12:42:53

回答

3

找到一種方式直接SQL中。從你的例子來看,你的數據是否適合這種方法並不明顯,但是要努力做到這一點。在引擎中的一個聲明中,你完全不會改進完全的做法。