为何Snowflake JavaScript存储过程预期失败却标记为成功?
Snowflake存储过程执行状态标记问题解答
为什么查询历史标记为成功?
Snowflake把这次call执行标记为成功,核心原因是整个存储过程的执行流程完整结束,没有未被捕获的异常。你在代码里用try-catch块捕获了内部无效SQL的错误,还把错误信息包装成返回值返回,存储过程本身没有触发任何未处理的异常,所以Snowflake判定这个存储过程调用是成功的——它只看存储过程有没有正常跑完,不关心你内部的SQL有没有出错。
如何让查询历史正确标记失败?
要让存储过程执行在查询历史里显示失败,必须在catch块里主动抛出一个未被捕获的异常,打断存储过程的正常执行流程。修改后的代码如下:
create procedure broken() returns varchar not null language javascript as $$ var result = ""; try { snowflake.execute( {sqlText: "Invalid Command!;"} ); result = "Succeeded"; } catch (err) { // 构造完整错误信息并抛出 var errorMsg = "Failed: Code: " + err.code + "\n State: " + err.state; errorMsg += "\n Message: " + err.message; errorMsg += "\nStack Trace:\n" + err.stackTraceTxt; throw errorMsg; // 主动抛出异常,让存储过程整体执行失败 } return result; $$ ;
调用修改后的存储过程时,不仅会看到错误信息,call命令的执行状态会被标记为失败,查询历史里也会同步显示失败状态。
额外说明
- Snowflake判断存储过程调用是否成功的唯一标准是:存储过程是否无未捕获异常地完成执行。只要你用
try-catch吞了内部错误,它就认为执行成功。 - 抛出异常后,调用时的错误提示和你之前返回的自定义信息一致,但执行状态会从成功变成失败,满足查询历史的标记需求。
内容的提问来源于stack exchange,提问作者mas
相关产品推荐
相关产品推荐

