Коды возврата sqlldr - ex_warn - PullRequest
0 голосов
/ 24 августа 2011

Я хочу знать, загружен ли мой файл полностью в базу данных.

если вы проверите коды возврата здесь , вы увидите, что 1 и 3 - сбой.

EX_SUCC 0
EX_FAIL 1
EX_WARN 2
EX_FTL  3

EX_WARN (код возврата 2) включает следующие случаи:

All or some rows rejected EX_WARN

All or some rows discarded EX_WARN

Discontinued load EX_WARN

Теперь первый и второй управляемы.

Третий мне пришлось искать в документах. Если вы прочитаете это , вы увидите, что «прекращенные загрузки» включают «фатальные ошибки», «CTRL-C» и «ошибки пространства». В этом случае я бы, вероятно, не получил ни одной записи, или некоторые отклоненные записи, код возврата EX_WARN и неполный файл, загруженный в базу данных.

Если нет отклоненных записей, это просто: это была прекращенная загрузка. Я должен выйти с ошибкой. Но когда я отклонил какую-то запись, я не уверен, что мой файл полностью загружен в базу данных. (Некоторые отклоненные строки приемлемы для меня.) Я прав?

Если да, какое решение? Как узнать, была ли вся таблица загружена в БД?

Ответы [ 2 ]

2 голосов
/ 25 августа 2011

Может возникнуть ситуация, когда SQL Loader вставил (и зафиксировал) несколько строк из файла данных, но не смог достичь конца этого файла (т. Е. После точки сбоя могло быть больше записей, которые в противном случае были бы успешными) .

Я бы выбрал внешнюю таблицу через SQL Loader, используя INSERT INTO dest_table ... SELECT * FROM external_table. Это была бы атомарная операция, и есть (как правило, небольшая) вероятность того, что она потерпит неудачу, если у вас недостаточно отмен для отката (так как вы не используете промежуточные коммиты).

Я бы также минимизировал возможности отклонений на уровне внешней таблицы / загрузчика SQL, рассматривая все как общий текст, пока он не будет загружен в базу данных. Затем я применил бы структуру и использовал бы регистрацию ошибок DML, чтобы обработать что-нибудь нерегулярное. Таким образом, у вас есть четкий доступ к отклоненным данным и причина отклонения в базе данных.

0 голосов
/ 25 августа 2011

Кажется, я был прав.Я считаю хорошим решением комментарий Алекса Пула, решение Гэри (рекомендуется также Томом Кайтом), и я нашел еще один трюк в собеседовании с моими коллегами:

Чтобы поставить ОПЦИИ (ROWS = 100000000) - большечем входные данные могут иметь - и загружать условно.(У нас будет только один коммит или его нет) При этом мы знаем, что, если что-то загружено, загружается все.

...