3

我正在使用 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 语句来捕获它?

非常感谢!

4

4 回答 4

3

这是一个棘手的问题。

Verticavsql有一个变量,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 (安静)只有查询输出,没有消息。

然后,如果目标文件不存在,您确实有一个 bash 非空退出状态:

[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-13T06:05:59.277 回答
0

用于mkdir -p /data确保在查询之前目录存在。

于 2013-09-11T03:00:54.017 回答
0

我有类似的问题,并找到了一种简单的方法来解决它。我注意到,当查询失败时,结果 csv 文件大小实际上变为 0。您可以检查结果 csv 文件大小是否为 0。

vsql -c "你的查询命令" -o "/location/of/results"

如果 [[ -s "/location/of/results" ]]; 然后
    some_other_command
菲
于 2013-11-19T06:37:27.317 回答
0

此外,如果您收到此错误:ERROR 5286: Unsupported SET option ON_ERROR_STOP

您可以使用以下vsql选项:vsql -v ON_ERROR_STOP=on

于 2017-10-13T20:20:19.840 回答