Я пытаюсь отладить ошибку DML, которая происходит в одной среде, но не в других. Установка такова:
У меня есть около 10 наборов операций DML (массовая выборка из удаленной таблицы, массовая вставка в локальную таблицу), и две из них дают ошибки DML, аромат «Неверное число», а другая - «PL / SQL: числовой» или значение ошибки: Массовая привязка: усеченная привязка ".
Я попытался скопировать данные в «хорошую» среду и не смог воспроизвести ту же ошибку. Поэтому я сейчас пытаюсь создать более надежный обработчик ошибок, чтобы перехватывать их и помогать точно определить, какая часть данных вызывает у меня проблемы.
Что у меня выглядит так:
...
loop
fetch c_some_data bulk collect into v_arr limit v_limit_size;
forall i in 1..v_arr.count SAVE EXCEPTIONS
insert into table_abc_1 values v_arr(i);
exit when c_some_data%notfound;
end loop;
...
exception
when X_DML_ERRORS then
declare
j integer;
begin
FOR j IN 1 .. SQL%BULK_EXCEPTIONS.COUNT LOOP
begin
/*only print the KEY fields for this table,
this table has (I think) close to 20 fields*/
dbms_output.put_line('DML Bulk-operation error: ' ||
' Error Code: '||SQLERRM(-SQL%BULK_EXCEPTIONS(j).ERROR_CODE)||'; '||
v_arr(SQL%BULK_EXCEPTIONS(j).ERROR_INDEX).stage||'; '||
v_arr(SQL%BULK_EXCEPTIONS(j).ERROR_INDEX).id||'; '||
v_arr(SQL%BULK_EXCEPTIONS(j).ERROR_INDEX).code||'; ')
end;
end loop;
end;
when others then
PKG_EXCPTN.sp_generic_exception_handler;
end;
Я уверен, что мог бы просто напечатать все столбцы, но таблицы большие (некоторые с> 20 столбцами), и есть 10 блоков кода, которые потенциально могут иметь эту проблему. Также потребуется, чтобы кто-то посмотрел на каждое значение в сообщении и выяснил, соответствует ли оно типу столбца (varchar2 и число).
Есть ли простой способ напечатать поле, в котором произошла ошибка, и значение, вызвавшее ошибку?
(с использованием Oracle 10g)