2016-12-30 1 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; 
관련 문제