【发布时间】:2020-04-01 15:48:16
【问题描述】:
我有几个 Snowflake 存储过程,当它们成功时,它会显示我创建的自定义消息,我宁愿显示 Snowflake 在“查询结果”窗口中显示的相同消息。
例如,我使用 COPY TO 语句执行存储过程。我希望成功执行此存储过程以显示成功导出的行数。能否像错误消息一样轻松地捕获和显示它们的成功信息?
【问题讨论】:
标签: stored-procedures snowflake-cloud-data-platform
我有几个 Snowflake 存储过程,当它们成功时,它会显示我创建的自定义消息,我宁愿显示 Snowflake 在“查询结果”窗口中显示的相同消息。
例如,我使用 COPY TO 语句执行存储过程。我希望成功执行此存储过程以显示成功导出的行数。能否像错误消息一样轻松地捕获和显示它们的成功信息?
【问题讨论】:
标签: stored-procedures snowflake-cloud-data-platform
是的,您可以使用 JavaScript 存储过程来做到这一点。当 Snowflake 运行一个只返回状态消息的查询时,它会将其作为一个表返回,其中包含一个“状态”列和一个包含状态的行。您可以返回该值。您可能需要考虑如果出现 SQL 错误会发生什么:在 SP 中本地处理它或抛出错误以便调用会话知道有错误。无论哪种方式,状态返回都会显示一条错误消息,如果有的话。
这是一个使用 JavaScript SP 的示例。它还有一些辅助函数,我经常使用这些函数来执行单值查询和非查询语句,只是寻找返回值:
create or replace procedure SampleSP()
returns string
language javascript
as
$$
try{
return ExecuteNonQuery("create table MY_NATION_TABLE as select * from SNOWFLAKE_SAMPLE_DATA.TPCH_SF1.NATION;");
}
catch(err){
return err;
}
// ----------------------------------------------------------------------------------
// Main function above; helper functions below
function ExecuteNonQuery(queryString) {
return ExecuteSingleValueQuery("status", queryString)
}
function ExecuteSingleValueQuery(columnName, queryString) {
var out;
cmd1 = {sqlText: queryString};
stmt = snowflake.createStatement(cmd1);
var rs;
try{
rs = stmt.execute();
rs.next();
return rs.getColumnValue(columnName);
}
catch(err) {
if (err.message.substring(0, 18) == "ResultSet is empty"){
throw "ERROR: No rows returned in query.";
} else {
throw "ERROR: " + err.message.replace(/\n/g, " ");
}
}
return out;
}
$$;
-- Run this twice to see the effect of an error. You can remove the try block
-- in the main function of the SP to generate a SQL error instead of just
-- returning a string with the error text
call SampleSP();
【讨论】: