【问题标题】:how to get the output of a stored procedure as task output in snowflake如何获取存储过程的输出作为雪花中的任务输出
【发布时间】:2021-10-03 10:48:01
【问题描述】:

我创建了一个存储过程,它返回带有成功消息的字符串以及插入的行数或错误消息,如文件未找到或手动执行时未加载数据。当我用任务调用相同的存储过程时,它显示(task_history)成功。并且无法找到数据是否已加载。必须手动检查。

当我提到以下问题时Snowflake a working procedure is not being successfully executed when calling it within a scheduled task

过程和任务具有相同的所有者(所有者具有全局执行任务权限)。

但数据在手动和任务调用过程中都会更新。

如果存储过程返回错误,如何使返回值出现在任务中,并使任务不执行后续任务。

【问题讨论】:

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


    【解决方案1】:

    您可以使用 SYSTEM$SET_RETURN_VALUE 在您的第一个任务中设置返回值。 SYSTEM$SET_RETURN_VALUE Documentation

    在任务树中,任务可以调用这个函数来设置返回 价值。将此任务标识为前置任务的另一个任务 (在任务定义中使用 AFTER 关键字)可以检索 返回前任任务设置的值。

    然后,您可以在下一个任务中使用 SYSTEM$GET_PREDECESSOR_RETURN_VALUE 来调节您的操作(例如,如果 return_value 包含错误,则什么也不做)。

    返回值将出现在 TASK_HISTORY 中进行监控。 TASK_HISTORY Documentation

    【讨论】:

      【解决方案2】:

      从存储过程中获取返回值以保存到任务历史记录有 2 个部分。

      1. 存储过程应该“EXECUTE AS CALLER”
      2. 您需要使用返回值调用 system$set_return_value

      例子

      CREATE OR REPLACE PROCEDURE MySchema.MyStoredProcedure()
      RETURNS VARIANT
      LANGUAGE JAVASCRIPT
      EXECUTE AS CALLER
      AS $$
      
          let command1 =  = `DELETE FROM MySchema.MyTable WHERE rownum > 10;`;
          let stmt1 = snowflake.createStatement({sqlText: command1});
          let rs = stmt1.execute();
          rs.next();
          let deleted = rs.getColumnValue(1);
      
          //This requires the SP to be run as CALLER - This return value is logged in Task History
          stmt1 = snowflake.createStatement({sqlText:`call system$set_return_value(' { "RowsDeleted": ${deleted} }');`});
          rs = stmt1.execute();
      
          return { "RowsDeleted": deleted };
      
      $$;

      【讨论】:

        猜你喜欢
        • 2022-11-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-28
        • 2018-05-22
        • 1970-01-01
        • 2017-07-24
        • 1970-01-01
        相关资源
        最近更新 更多