在 Snowflake 存储过程中捕获成功消息
Capture Success Message in Snowflake Stored Procedure
我有几个 Snowflake 存储过程,当它们成功时,它会显示我创建的自定义消息,我宁愿显示 Snowflake 在查询结果中显示的相同消息 window。
例如,我使用 COPY TO 语句执行存储过程。我希望成功执行此存储过程以显示成功导出的行数。他们能否像错误消息一样轻松捕获和显示成功信息?
是的,您可以使用 JavaScript 存储过程来完成此操作。当 Snowflake 运行 return 仅包含状态消息的查询时,它 return 将其作为 table 具有单列 "status" 和单行状态。您可以 return 该值。您可能需要考虑如果出现 SQL 错误会发生什么:在 SP 中本地处理它或抛出错误以便调用会话知道有错误。无论哪种方式,状态 return 都会显示一条错误消息(如果有的话)。
这是一个使用 JavaScript SP 的示例。它还有一些辅助函数,我经常使用这些函数来执行单值查询和非查询语句,只是寻找 return 值:
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();
我有几个 Snowflake 存储过程,当它们成功时,它会显示我创建的自定义消息,我宁愿显示 Snowflake 在查询结果中显示的相同消息 window。
例如,我使用 COPY TO 语句执行存储过程。我希望成功执行此存储过程以显示成功导出的行数。他们能否像错误消息一样轻松捕获和显示成功信息?
是的,您可以使用 JavaScript 存储过程来完成此操作。当 Snowflake 运行 return 仅包含状态消息的查询时,它 return 将其作为 table 具有单列 "status" 和单行状态。您可以 return 该值。您可能需要考虑如果出现 SQL 错误会发生什么:在 SP 中本地处理它或抛出错误以便调用会话知道有错误。无论哪种方式,状态 return 都会显示一条错误消息(如果有的话)。
这是一个使用 JavaScript SP 的示例。它还有一些辅助函数,我经常使用这些函数来执行单值查询和非查询语句,只是寻找 return 值:
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();