使用 Snowflake 中的任务调用存储过程

Posted

技术标签:

【中文标题】使用 Snowflake 中的任务调用存储过程【英文标题】:Calling a stored procedure using a task in Snowflake 【发布时间】:2020-10-05 18:56:08 【问题描述】:

我写了一个任务,每个周末都调用这个过程。

这是我将值插入表格的过程

CREATE OR REPLACE TABLE TABLE1(DATABASE_ VARCHAR, TABLE_ VARCHAR); // Table to store values

CREATE OR REPLACE PROCEDURE TASK_()   //Procedure to insert values into table
    RETURNS string
    LANGUAGE javascript
    AS
    $$
        var str = '';
        var stmt = snowflake.createStatement(sqlText: "INSERT INTO TABLE1 VALUES ('DB1','TB1')");
        stmt.execute(); 
        return str;
    $$;

这是我每个周末都会调用上述过程的任务。

CREATE TASK mytask_hour
  WAREHOUSE = COMPUTE_WH
  SCHEDULE = 'USING CRON 0 0 * 1-12 SUN America/Los_Angeles'
  TIMESTAMP_INPUT_FORMAT = 'YYYY-MM-DD HH24'
as
  call TASK_();

但是当我检查时,上面的任务没有运行,并且值没有插入到表中。

所以,我尝试调试我的任务并编写了一个每分钟调用上述过程的任务。

create task mytask_hour
  warehouse = COMPUTE_WH
  schedule = '1 minute'
as
  call TASK_();

即使这个任务也没有成功。不明白我哪里做错了

【问题讨论】:

如何检查任务是否运行? @Marcel 我通过查询给我一个空表的表来检查 @R0bert 添加了一个用于故障排除任务的链接,请查看此docs.snowflake.com/en/user-guide/tasks-ts.html 【参考方案1】:

创建一个任务是不够的。下一步是恢复它,因为任务默认处于“暂停”状态。

在你的情况下,声明是

ALTER TASK mytask_hour resume;

结果:任务按您的计划运行。

除此之外,您必须牢记这一点

恢复/暂停任务需要对该任务的 OWNERSHIP 或 OPERATE 权限 OWNERSHIP-role 具有 EXECUTE T​​ASK 权限,可以由 ACCOUNT ADMIN 分配

更多信息请看这里:https://docs.snowflake.com/en/sql-reference/sql/alter-task.html

【讨论】:

我只是想确保SCHEDULE = 'USING CRON 0 0 * 1-12 SUN America/Los_Angeles' TIMESTAMP_INPUT_FORMAT = 'YYYY-MM-DD HH24' 是正确的,即它每个周末都会运行任务 你可以使用这个网站来验证你的表达cronmaker.com【参考方案2】:

创建任务后,必须执行

ALTER TASK … RESUME

https://docs.snowflake.com/en/sql-reference/sql/create-task.html

我希望这会有所帮助...丰富

附言如果这个(或另一个)答案对您有帮助,请花点时间“接受”有帮助的答案 通过单击答案旁边的复选标记将其从“灰色”切换为“已填充”。

【讨论】:

以上是关于使用 Snowflake 中的任务调用存储过程的主要内容,如果未能解决你的问题,请参考以下文章

如何更改 Snowflake 存储过程中的会话参数

Snowflake 中的存储过程能否提供一个表值输出,就像我们在 SQL Server 中得到的一样

可以从雪花中的函数调用存储过程吗

如何使用 Snowflake Javascript 存储过程或函数遍历表中的所有列?

Snowflake 存储过程中的最大 JavaScript 字符串大小

在 SnowFlake DB 中并行执行存储过程中的 SQL 语句