2016-12-30 40 views
-1

我試圖批量更新記錄。運行完所有更新後,我需要調用一個過程,並將所有成功更新的ID作爲過程的參數之一發送。所有那些由於某些錯誤而未執行更新的ID不應傳遞給過程。我的代碼如下。從oracle中的「for all update」獲取成功更新的ID

DECLARE 
    type emp_type is TABLE OF number; 
    EMP_ID EMP_TYPE; 
    lv_select varchar2(4000):='select employee_id from EMPLOYEE where dept_NO=1'; 
BEGIN 
    EXECUTE IMMEDIATE lv_select BULK COLLECT INTO emp_id ; 

    FORALL INDX IN 1 ..emp_id.COUNT SAVE EXCEPTIONS 
    UPDATE emp Set salary=salary+1000 
    where employee_id=emp_id(INDX); 

    PROC (
    PAR1=>'abc', 
    par2=>emp_id(INDX), 
    par3=>'xyz' 
    ); 
EXCEPTION 
    WHEN OTHERS 
    THEN 
    FOR J IN 1 .. SQL%BULK_EXCEPTIONS.COUNT 
    LOOP 
     DBMS_OUTPUT.PUT_LINE(SQLERRM (-SQL%BULK_EXCEPTIONS (j).ERROR_CODE)); 
    END LOOP; 
END; 
+0

我認爲您需要將您的'FORALL'更改爲簡單的'FOR'循環才能實現。 – GurV

+0

加上你的程序調用目前不在循環中 – GurV

回答

0

這可以通過使用簡單的LOOP簡單地實現。希望低於snoippet有幫助。

DECLARE 
    type emp_type 
    IS 
    TABLE OF NUMBER; 
    EMP_ID EMP_TYPE; 
    lv_select VARCHAR2(4000):='select employee_id from EMPLOYEE where dept_NO=1'; 
    BEGIN 
    EXECUTE IMMEDIATE lv_select BULK COLLECT INTO emp_id ; 
    FOR indx IN emp_id.first.emp_id.last 
    LOOP 
     BEGIN 
     UPDATE emp SET salary=salary+1000 WHERE employee_id=emp_id(indx); 
     PROC (PAR1=>'abc', par2=>emp_id(INDX), par3=>'xyz'); 
     EXCEPTION 
     WHEN OTHERS THEN 
     dbms_output.put_line(emp_id(indx)|| 'Failed due to '||sqlerrm||'-'||SQLCODE); 
     END; 
    end loop; 
    END;