如何在Vertica中停止或中断(或引发错误)脚本的执行

时间:2016-11-10 23:16:11

标签: sql vertica

在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中是否有替代(更标准)的方法。提前感谢您的建议!

3 个答案:

答案 0 :(得分:1)

Vertica没有控制流设施,因此必须在查询和vsql之外处理控制流

  1. 执行vsql查询以执行某些操作
  2. 执行vsql查询以进行检测 如果做了什么
  3. 如果成功,则执行下一个vsql查询 什么......等等。
  4. 使用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。

    • stderr 1 =脚本中出现了某种形式的错误
    • stderr 2 =一些 运行脚本时发生连接终止的形式

    另一种方法是让查询返回一个值,以检测前一个脚本是否具有所需的结果

    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;