Отладка массовой ошибки DML в Oracle - как определить, какое значение вызвало ошибку? - PullRequest
3 голосов
/ 17 ноября 2011

Я пытаюсь отладить ошибку 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)

1 Ответ

3 голосов
/ 17 ноября 2011

вы можете использовать LOG ERRORS INTO в своем выражении DML, это позволит вам записывать ваши ошибки и неверные данные в таблицу, чтобы вы могли проверить их позже.

см .: http://www.oracle -developer.net / display.php? Id = 329

и: http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/statements_9014.htm#BGBDIGAH

...