2016-12-30 11 views
-1

Я пытаюсь обновить записи навалом. После запуска для всего обновления мне нужно вызвать процедуру и отправить все успешно обновленные идентификаторы как один из параметров процедуры. Все эти идентификаторы, для которых обновление не было выполнено из-за некоторой ошибки, не должны передаваться процедуре. Мой код ниже.Получение успешного обновления id из «для всех обновлений» в oracle

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;