Stored procedures 在Snowflake存储过程中捕获成功消息

Stored procedures 在Snowflake存储过程中捕获成功消息,stored-procedures,snowflake-cloud-data-platform,Stored Procedures,Snowflake Cloud Data Platform,我有几个Snowflake存储过程,当它们成功时,它会显示我创建的自定义消息,我宁愿显示Snowflake在查询结果窗口中显示的相同消息。 例如,我使用COPY TO语句执行一个存储过程。我希望此存储过程的成功执行显示成功导出的行数。是否可以像错误消息一样轻松地捕获和显示成功信息?是的,您可以使用JavaScript存储过程来实现这一点。当Snowflake运行一个只返回状态消息的查询时,它会将其作为一个表返回,该表包含一列“status”和一行status。您可以返回该值。您可能想考虑如果存在

我有几个Snowflake存储过程,当它们成功时,它会显示我创建的自定义消息,我宁愿显示Snowflake在查询结果窗口中显示的相同消息。

例如,我使用COPY TO语句执行一个存储过程。我希望此存储过程的成功执行显示成功导出的行数。是否可以像错误消息一样轻松地捕获和显示成功信息?

是的,您可以使用JavaScript存储过程来实现这一点。当Snowflake运行一个只返回状态消息的查询时,它会将其作为一个表返回,该表包含一列“status”和一行status。您可以返回该值。您可能想考虑如果存在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();

这很有帮助。在调用之前,我必须将EXECUTE AS CALLER添加到存储过程中,因为这将使我开始了解我需要的内容。我注意到,在昨天所做的一些工作中,一些非查询结果返回时包含多个列(合并、更新)。您可能需要根据返回的结果集调整结果集合。是的,我也注意到了这一点。例如,在执行COPY TO语句时,我希望收集行和列。我将探讨许多常见的语句,并找出要传递的内容。