2017-03-09 76 views
-1

我正在對100萬條記錄的記錄執行批量更新操作。我需要在每5000條記錄之間進行COMMIT操作,我該如何執行?在oracle中提交批量更新

update tab1 t1 
    set (col1,col2,col3,col4)= 
    (select col1,col2,col3,col4 from tab_m where row_id= t1.row_id); 
+3

爲什麼你認爲你需要每5K做一次提交? https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:4951966319022 – OldProgrammer

+2

另請參閱https://asktom.oracle.com/pls/asktom/f? p = 100:11:0 :: NO :: P11_QUESTION_ID:6407993912330 – OldProgrammer

+0

如果有任何例外,我不需要處理已更新的記錄 – Thej

回答

0

如果您正在尋找在PLSQL一個解決方案,您可以通過如下使用BULK INSERT/UPDATE做到這一點:

DECLARE 
     c_limit PLS_INTEGER := 100; 

     CURSOR employees_cur 
     IS 
      SELECT employee_id 
      FROM employees 
      WHERE department_id = department_id_in; 

     TYPE employee_ids_t IS TABLE OF employees.employee_id%TYPE; 

     l_employee_ids employee_ids_t; 
    BEGIN 
     OPEN employees_cur; 

     LOOP 
      FETCH employees_cur 
      BULK COLLECT INTO l_employee_ids 
      LIMIT c_limit;  -- This will make sure that every iteration has 100 records selected 

      EXIT WHEN l_employee_ids.COUNT = 0;   

     FORALL indx IN 1 .. l_employee_ids.COUNT SAVE EXCEPTIONS 
      UPDATE employees emp -- Updating 100 records at 1 go. 
      SET emp.salary = 
        emp.salary + emp.salary * increase_pct_in 
      WHERE emp.employee_id = l_employee_ids(indx); 
     commit;  
     END LOOP; 

    EXCEPTION 
     WHEN OTHERS 
     THEN 
      IF SQLCODE = -24381 
      THEN 
      FOR indx IN 1 .. SQL%BULK_EXCEPTIONS.COUNT 
      LOOP 
       -- Caputring errors occured during update 
       DBMS_OUTPUT.put_line (
         SQL%BULK_EXCEPTIONS (indx).ERROR_INDEX 
        || ‘: ‘ 
        || SQL%BULK_EXCEPTIONS (indx).ERROR_CODE); 

       --<You can inset the error records to a table here> 


      END LOOP; 
      ELSE 
      RAISE; 
      END IF; 
    END; 
0

每個問題,如果你只是想繼續更新,即使記錄失敗,錯誤然後我認爲你應該使用Oracle的DML錯誤日誌子句。希望這可以幫助。

BEGIN 
    DBMS_ERRLOG.CREATE_ERROR_LOG('TAB1'); 
    UPDATE tab1 t1 
    SET 
    (
     COL1, 
     COL2, 
     COL3, 
     COL4 
    ) 
    = 
    (SELECT COL1,COL2,COL3,COL4 FROM TAB_M WHERE ROW_ID= T1.ROW_ID 
    ) LOG ERRORS REJECT LIMITED UNLIMITED; 

END;