Snowflake SQL块中动态构造异常消息及语法错误解决
解决方案
以下是修正后的SQL脚本,可实现你的需求:
-- 调用目标存储过程 CALL SALES.ORDERS.ERROR_CHECK($database_name, $table_name, $initial_count, $final_count, '='); -- 检查执行结果并按需抛出异常 DECLARE msg VARCHAR; BEGIN -- 将存储过程返回的结果赋值给变量 SELECT ERROR_CHECK INTO msg FROM TABLE(RESULT_SCAN(LAST_QUERY_ID())); -- 判断是否为失败消息,若是则抛出异常终止执行 IF POSITION('Failed' IN msg) > 0 THEN RAISE EXCEPTION '%', msg; END IF; END; $$; -- 仅当上述块未抛出异常时,此语句才会执行 SELECT 'End of Script';
修正说明
- 移除了不必要的
EXECUTE IMMEDIATE:Snowflake支持直接编写匿名PL/SQL块,无需动态执行包裹。 - 替换字符串匹配方式:用
POSITION('Failed' IN msg) > 0替代LIKE,避免语法解析错误,同时实现“检测消息是否包含失败标识”的逻辑。 - 规范变量赋值:使用
SELECT ... INTO语法为变量赋值,符合Snowflake PL/SQL的标准写法。
当存储过程返回Failed: Row counts do NOT match.时,匿名块会抛出该消息作为异常,后续的SELECT语句将被终止;若返回成功消息,则脚本会正常执行到末尾。
内容的提问来源于stack exchange,提问作者JTD2021
相关产品推荐
相关产品推荐

