雪花存储过程异常和失败

Snowflake Stored Procedure Exception & Failure

专家们,

对雪花中的异常处理有疑问。我知道我们可以使用 try & catch 块来处理错误并使用 return/throw 错误消息。

  1. throw 和 return 有什么不同 - 我都试过了,它们的行为是一样的。
  2. 以上都发回错误信息。但是在调用程序中没有失败。我们有没有类似于oracle中的RAISE Error的东西。

如有问题请告诉我。

  1. return关键字return是一个值并退出当前函数。 returned 值可能是一条错误消息,但它 returned 是作为常规字符串而不是错误条件。
  2. throw 关键字引发错误并退出当前函数。如果上面的执行堆栈中没有任何内容捕获到错误,则执行会因错误而停止。

Throw 将生成新错误或将现有错误发送到堆栈中。如果您使用 try/catch 块和有关错误的“return”信息,您要离开的函数将不会指示错误情况。它可能会发送有关错误的信息,但由于代码捕获了错误,因此它不会进入堆栈,如果堆栈上没有捕获到错误,则可能会终止执行。

当您 运行 来自 Snowflake UI 的 JavaScript UDF 或存储过程时,您可以判断存在未捕获的错误,因为 return 返回红色的。如果错误返回为黑色或蓝色,即使错误消息报告错误,也已被捕获并且调用状态不是错误。这是一个例子:

create or replace procedure FOO()
returns string
language javascript
as
$$

    // Run a helper function here
    myFunction();

    function myFunction(){
        var mySqlStatement = "select * from NONEXISTENT_TABLE";
        var statement1 = snowflake.createStatement({sqlText: mySqlStatement});
        statement1.execute();
    }
$$;

call foo(); // This will generate an error and return in red text.

create or replace procedure FOO()
returns string
language javascript
as
$$
    try{
        myFunction();
    }
    catch(e){
        return e.message;
    }

    function myFunction(){
        var mySqlStatement = "select * from NONEXISTENT_TABLE";
        var statement1 = snowflake.createStatement({sqlText: mySqlStatement});
        statement1.execute();
    }
$$;

call foo();

// This will catch an error and return it in blue text.
//External clients will not report an error, even through the 
//SP returns the error message.