Я ошибки, в результате объемной операции вставки, как это:Oracle DML ошибки, не имеющие деталей
begin
--bulk insert
forall i in v_data.first .. v_data.last save exceptions
insert into my_filter_table values v_data (i);
commit;
exception
-- catch and print the saved-up DML errors.
when X_DML_ERRORS then
declare
v_iteration number;
begin
dbms_output.put_line('');
dbms_output.put_line('DML Errors:');
for i in 1 .. SQL%BULK_EXCEPTIONS.count loop
v_iteration := SQL%BULK_EXCEPTIONS(i).error_index;
dbms_output.put_line('Iteration: '||v_iteration||' Message: '||
SQLERRM(-SQL%BULK_EXCEPTIONS(i).ERROR_CODE));
end loop;
end;
end;
Результат выглядит примерно так:
Iteration: 3 Message: ORA-01400: cannot insert NULL into() Iteration: 4 Message: ORA-02290: check constraint (.) violated Iteration: 8 Message: ORA-00001: unique constraint (.) violated
Тот факт, что я получаю ошибки делает не беспокоить меня, поскольку я тестирую код обработки ошибок. Проблема заключается в том, что сообщение об ошибке Oracle не отображает имена ограничений, то есть отображает check constraint (.) violated
, но это не говорит мне, КОТОРЫЙ проверяет ограничение, которое я нарушил.
Кто-нибудь знает, что с этим?
(Oracle версия 10,2)
@Daniel ОМГЭ: Ммм да это имеет смысл. Стреляйте! Я полагаю, что% BULK_EXCEPTIONS не хранит детали конкретной ошибки, поэтому то, что я пытаюсь сделать, вероятно, невозможно. – FrustratedWithFormsDesigner
Я думал об обходном пути. Вы можете повторно выполнить оператор в обработчике исключений для каждой неудавшейся строки. Затем вы можете поймать это исключение, которое будет иметь имя ограничения. –
Эй, это очень умно! Благодаря! :) – FrustratedWithFormsDesigner