2013-09-11 1 views
3

Я использую shell-скрипты для загрузки результатов запроса в мою базу данных. В сценарии сначала я сохраняю результаты запроса в файл csv, а затем загружаю файл в другую базу данных. После каждого шага я отправляю электронное письмо с уведомлением. Проблема, с которой я сталкиваюсь, заключается в том, что я не могу выполнить правильную обработку ошибок. Например, я использую нечто вроде команды ниже, чтобы создать файл CSV:Обработка ошибок vsql (нет такого файла или каталога)

/apps/vertica/vertica_v5.1.6/bin/vsql -h server.my.com -U "user" -w "pass" -o "/data/test.csv" -c "select count(*), month from table1 group by month" 

Если каталог «данные» не существует, статус выхода в Unix все еще возвращает 0 (операция выполнена успешно, даже если произошла ошибка), так как результаты запроса отображаются на экране. Как я могу справиться с такой ошибкой? Какой оператор IF я должен использовать в своем скрипте для его захвата?

Большое спасибо!

ответ

0

Используйте mkdir -p /data, чтобы убедиться, что каталог существует до вашего запроса.

+1

Да, но мой вопрос касается того, как правильно обрабатывать ошибки, и если vsql передает какое-либо сообщение в Unix. могут быть и другие ошибки, и я хочу знать, как их управлять. – saghar

+0

Вы можете управлять ошибками в соответствии с выходом 'vsql'. Используйте 'output = $ (ваша команда)' для захвата вывода 'vhost'. – clyfish

+1

, тогда вывод $ output будет результатом запроса. как это могло помочь в обработке ошибок? – saghar

2

Это сложный вопрос.

Vertica vsql имеет переменную, которая ON_ERROR_STOP если набор будет остановить скрипт и возвращает код ошибки 3.

\set ON_ERROR_STOP on 

сказанного, с помощью опции -o не кажется, чтобы вызвать такое поведение в качестве Ошибка не на стороне SQL.

То, что я хотел бы предложить то, чтобы обмануть, и перенаправить вывод вместо того, чтобы просить Vertica, чтобы сделать это:

/apps/vertica/vertica_v5.1.6/bin/vsql -h server.my.com -U "user" -w "pass" -A -F, -c "select count(*), month from table1 group by month" > /data/test.csv 

Обратите внимание на -F, и опции -A для создания CSV-файла, как выход. Возможно, вам понадобится -q (quiet), чтобы иметь только вывод запроса, никаких сообщений.

Затем, если файл назначения не существует, то есть Баш нон статус нулевой выхода:

[[email protected] ~]$/apps/vertica/vertica_v5.1.6/bin/vsql -h server.my.com -U "user" -w "pass" -A -F, -c "select count(*), month from table1 group by month" > /data/test.csv 
-bash: /data/test.csv: No such file or directory 
[[email protected] ~]$ echo $? 
1 

С тех пор, достаточно легко проверить код возврата, ловя как Баш и Vertica

# your vsql command.... 
STATUS=$? 
if [[ $STATUS -gt 0 ]] 
then 
    echo oops 
    exit 
fi 

Возможно, вы даже создадите функцию, принимающую запрос и выходной файл в качестве аргумента, если у вас их много.

0

У меня есть аналогичная проблема и нашла простой способ справиться с этим. Я заметил, что, когда запросы не размер результатов CSV-файл фактически становится 0. Вы можете сделать проверку, чтобы увидеть, если результаты в формате CSV размер файла составляет 0.

 
vsql -c "your queries command" -o "/location/of/results" 

if [[ -s "/location/of/results" ]]; then 
    some_other_command 
fi 
0

Кроме того, если вы получаете эту ошибку: ERROR 5286: Unsupported SET option ON_ERROR_STOP

Вы можете использовать опцию vsql: vsql -v ON_ERROR_STOP=on

+0

Это работает для вас? Я поставил эту опцию, но она все еще не улавливает ошибки. – dessskris

+0

Это сработало для меня. – MrMauricioLeite

Смежные вопросы