2016-12-30 137 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;