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

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

【问题讨论】:

    标签: stored-procedures snowflake-cloud-data-platform


    【解决方案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 列。我将探索许多常见的陈述并找出要传递的内容。
    猜你喜欢
    • 2021-10-01
    • 2021-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-11
    • 2020-12-10
    • 2020-09-28
    • 2021-02-13
    相关资源
    最近更新 更多