如何在Snowflake Task执行的存储过程中输出错误?遇RAISE_ERROR未定义问题
Snowflake JavaScript存储过程中RAISE_ERROR未定义问题解决
我参照建议编写了Snowflake JavaScript存储过程,尝试在catch块中用RAISE_ERROR输出错误信息,代码如下:
CREATE OR REPLACE PROCEDURE my_stored_procedure() RETURNS VARCHAR LANGUAGE JAVASCRIPT AS $$ try { // 存储过程业务代码 } catch (err) { // 输出错误信息 var errorMsg = 'Error in stored procedure: ' + err.message; RAISE_ERROR(errorMsg, 1001); } $$;
随后执行以下语句查询任务历史:
select * from table(information_schema.task_history( scheduled_time_range_start=>dateadd('day',-7,current_timestamp()), result_limit => 100, task_name=>'TS_COMBI_REFRESH')) order by scheduled_time;
但得到的错误信息始终为:
| Error_Message |
|---|
| JavaScript执行错误: Uncaught ReferenceError: TS_COMBI_REFRESH中未定义RAISE_ERROR,位置在' RAISE_ERROR(errorMsg, 1001);'第3位,堆栈跟踪: TS_COMBI_REFRESH第61行 |
问题原因
Snowflake的JavaScript存储过程环境中并不存在内置的RAISE_ERROR函数,这是错误的用法建议。
正确实现方式
在Snowflake JavaScript存储过程中,有两种标准方式抛出自定义错误:
方式1:直接抛出JavaScript Error对象
CREATE OR REPLACE PROCEDURE my_stored_procedure() RETURNS VARCHAR LANGUAGE JAVASCRIPT AS $$ try { // 存储过程业务代码 } catch (err) { var errorMsg = '存储过程执行错误: ' + err.message; throw new Error(errorMsg); } $$;
方式2:执行SQL的RAISE命令
通过snowflake.createStatement执行SQL的RAISE ERROR语句,这种方式可以更灵活地定义错误级别:
CREATE OR REPLACE PROCEDURE my_stored_procedure() RETURNS VARCHAR LANGUAGE JAVASCRIPT AS $$ try { // 存储过程业务代码 } catch (err) { var errorMsg = '存储过程执行错误: ' + err.message; snowflake.createStatement({ sqlText: "RAISE ERROR :1", binds: [errorMsg] }).execute(); } $$;
验证
修改存储过程代码后,重新创建存储过程并关联任务执行,再次运行任务历史查询语句,即可在ERROR_MESSAGE列中看到自定义的错误信息。
内容的提问来源于stack exchange,提问作者Ee Ann Ng
相关产品推荐
相关产品推荐

