在Vertica中,如果某些条件满足,我想停止运行脚本。例如,如果我的脚本发现一个表有非零行,那么脚本的其余部分应该不再运行(也就是说,脚本应该退出)并引发某种错误消息(例如,SQL SERVER中的RAISEERROR)
我只能考虑用public static T Clone<T>(this T source)
{
if (!typeof(T).IsSerializable)
{
return default(T);
}
if (ReferenceEquals(source, null))
{
return default(T);
}
var formatter = new BinaryFormatter();
Stream stream = new MemoryStream();
using (stream)
{
formatter.Serialize(stream, source);
stream.Seek(0, SeekOrigin.Begin);
return (T) formatter.Deserialize(stream);
}
}
包装脚本的其余部分,如下所示:
CASE WHEN
但我想知道Vertica中是否有替代(更标准)的方法。提前感谢您的建议!
答案 0 :(得分:1)
Vertica没有控制流设施,因此必须在查询和vsql之外处理控制流
使用Linux Bash,您可以尝试类似
的内容vsql -d YourDb -h YourHost -f Your.sql > 2&1
exit_code = "$?"
if [ "$exit_code" -ge "1" ] then;
exit(1)
fi
2&amp; 1将stderr重定向到stdout。
另一种方法是让查询返回一个值,以检测前一个脚本是否具有所需的结果
result_code = $(vsql .....etc)
if [ "$result_code" -eq "your trigger value" ] then;
exit(1)
fi
要发出条件信号,您可以让查询返回单个标量值,也可以使用与&gt;类似的原始查询。 2及1
SELECT
CASE
WHEN a.cnt = 0
THEN 1/0 -- Forces an error that will be picked up by >2&1
ELSE 0
END
FROM
(
SELECT
COUNT(*) AS cnt
FROM
my_table) AS a;
我将采用的方法是设置一个bash脚本来循环一个清单文件,其中包含我想按照我想要执行的顺序执行的脚本的名称。 我希望bash脚本维护一个执行文件的计数,将它们回显到部署日志。
我总是可以在部署结束时将部署日志的COPY FROM复制到Vertica表中,这样我就可以判断部署的数量是否应该部署的数量。它还将识别部署停止的点,以便您知道要回滚的内容。
答案 1 :(得分:1)
从Vertica 7.2开始您可以使用THROW_ERROR ( msg )
function。
答案 2 :(得分:-1)
如果有人想知道如何使用CASE WHEN
在Vertica中强制出错,这是一种方式:
SELECT
CASE
WHEN a.cnt = 0
THEN 'do something'
ELSE 'do other thing'
END
FROM
(
SELECT
COUNT(*) AS cnt
FROM
my_table) AS a;