我正在使用shell脚本将查询结果上传到我的数据库。在脚本中,我首先将查询结果保存到一个csv文件中,然后将该文件上传到另一个数据库。在每个步骤之后,我会向用户发送一封通知电子邮件。我面临的问题是我不能进行适当的错误处理。例如,我使用类似下面的命令来生成csv文件:
/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" 如果目录data不存在,Unix中的退出状态仍然返回0(即使发生错误,操作也成功),因为查询结果显示在屏幕上。我如何处理这样的错误?我应该在脚本中使用哪种IF语句来捕获它?
非常感谢!
发布于 2013-09-13 14:05:59
这是一个棘手的问题。
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)只有查询输出,没有消息。
然后,如果目标文件不存在,您将具有bash non null退出状态:
[me@server ~]$/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
[me@server ~]$ echo $?
1从那时起,检查返回代码就很容易了,可以同时捕获bash和Vertica
# your vsql command....
STATUS=$?
if [[ $STATUS -gt 0 ]]
then
echo oops
exit
fi您甚至可能会创建一个以查询和输出文件作为参数的函数(如果您有很多这样的文件)。
发布于 2013-09-11 11:00:54
使用mkdir -p /data确保在查询之前该目录已经存在。
发布于 2017-10-14 04:20:20
此外,如果您收到此错误:ERROR 5286: Unsupported SET option ON_ERROR_STOP
您可以使用vsql选项:vsql -v ON_ERROR_STOP=on
https://stackoverflow.com/questions/18731731
复制相似问题