在雪花存储过程中捕获成功消息

Posted

技术标签:

【中文标题】在雪花存储过程中捕获成功消息【英文标题】:Capture Success Message in Snowflake Stored Procedure 【发布时间】:2020-04-01 15:48:16 【问题描述】:

我有几个 Snowflake 存储过程,当它们成功时,它会显示我创建的自定义消息,我宁愿显示 Snowflake 在“查询结果”窗口中显示的相同消息。 例如,我使用 COPY TO 语句执行存储过程。我希望成功执行此存储过程以显示成功导出的行数。能否像错误消息一样轻松地捕获和显示它们的成功信息?

【问题讨论】:

【参考方案1】:

是的,您可以使用 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();

【讨论】:

这很有帮助。我必须在 as 之前将 EXECUTE AS CALLER 添加到存储过程中,这将使我开始使用我需要的东西。 我注意到在我昨天做的一些工作中,一些非查询结果返回了不止一列(合并、更新)。您可能需要针对它们返回的结果集调整结果集合。 是的,我也注意到了这一点。例如,在执行 COPY TO 语句时,我想收集 rows_unloaded 列。我将探索许多常见的陈述并找出要传递的内容。

以上是关于在雪花存储过程中捕获成功消息的主要内容,如果未能解决你的问题,请参考以下文章

雪花存储过程中的事务

雪花存储过程调用具有迭代返回消息的多个语句

如何在雪花中调用另一个存储过程中的存储过程

如何获取雪花中执行存储过程的名称?

避免雪花中存储过程的重复

雪花存储过程从 dbt 失败