2016-10-10 9 views
0

Мы выполняем SQL-загрузчик в Perl с помощью команды, как:
`sqlldr $db_arg control=$ctl data=$data log=$log bad=$bad`;Поймайте SQL-загрузчик исключение во время выполнения SQL-загрузчик как команда в Perl

Но таким образом мы не можем найти, если SQL-погрузчик бросками любое исключение.

Например: даже если данные имеют 30 000 записей, и проблема возникла после загрузки 1000 записей, мы получаем сообщение, в котором было загружено 1000 записей.

Есть ли способ узнать, выбрал ли sql-loader любое исключение и какое именно исключение.

Примечание: подсчет строк в файле данных оказывается довольно дорогостоящим, поскольку файл должен быть выполнен как на некоторых старых серверах Windows Server, так и на Unix-серверах, поэтому использование `wc` не является вариантом.

+2

Если вы хотите, чтобы код выхода 'sqlldr', вы должны использовать 'system()' и проверить '$?' потом – oals

ответ

0

Использование обратных тиков для запуска внешней программы является рекомендуемым вариантом, если вы хотите захватить все, что программа записывает в STDOUT. Если вы не захватываете данные, возвращаемые обратными тиками (в скалярной переменной или массиве), вы используете неправильный инструмент для задания.

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

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

«ниже» упоминается, по-видимому, этот пример кода (который на самом деле проверяет $?, а не значение, возвращаемое system()):

if ($? == -1) { 
    print "failed to execute: $!\n"; 
} 
elsif ($? & 127) { 
    printf "child died with signal %d, %s coredump\n", 
     ($? & 127), ($? & 128) ? 'with' : 'without'; 
} 
else { 
    printf "child exited with value %d\n", $? >> 8; 
}