Snowflake 在循环中调用存储过程 N 次

Snowflake call a stored procedure inside a loop N times

我有一个雪花存储过程,运行一次处理 4 小时的数据并输出第一个小时的条目。

它有 3 个参数,即 start_hour、end_hour 和输出 table 名称。

我想运行循环一整天,我正在尝试编写以下循环过程:

create procedure abc_daily()
returns varchar
language sql
as
$$
    declare
        iteration_limit integer default 24;
        counter integer default 0;
    begin
        for i in 0 to iteration_limit do
              
            call abc(
            date_trunc('hour', dateadd(hour, counter, convert_timezone('UTC', '2022-05-10  00:00:00.000 +0000'))),
            date_trunc('hour', dateadd(hour, counter, convert_timezone('UTC', '2022-05-10  04:00:00.000 +0000'))),
           'output table name'

            
            counter := counter + 1;
        end for;
    end;
$$;

date_add 会帮助我 window 滑到第 23 个小时。

然而,当我运行这个创建命令时,我得到

Syntax error: unexpected 'abc'. (line 19)

好像无法识别呼叫命令。

有人能帮忙搞定这个 运行ning 吗?

我需要在这里使用snowflake.execute吗?

您的调用没有结束父项和分号,无法识别您的时间

尝试:

create procedure abc_daily()
returns varchar
language sql
as
$$
declare
    iteration_limit integer default 24;
    counter integer default 0;
begin
    for i in 0 to iteration_limit do
           
        call abc(
            date_trunc('hour', dateadd(hour, counter, convert_timezone('UTC', '2022-05-10  00:00:00.000'))),
            date_trunc('hour', dateadd(hour, counter, convert_timezone('UTC', '2022-05-10  04:00:00.000'))),
           'output table name');
            
        counter := counter + 1;
    end for;
end;
$$;

或者将时间戳放入一个变量中,然后重复使用它:

create procedure abc(f timestamp_ntz, t timestamp_ntz, s text)
returns text
language sql
as
$$
begin
    return f::text || t::text || s;
end;
$$;

create or replace procedure abc_daily()
returns varchar
language sql
as
$$
declare
    iteration_limit integer default 2;
    start_time timestamp_ntz;
begin
    start_time := date_trunc('hour', to_timestamp_ntz('2022-05-10 00:00:00.000'));
    
    for i in 0 to iteration_limit do

        call abc( dateadd(hour, :i, :start_time), dateadd(hour, :i+4, :start_time), 'output table name');
    end for;
end;
$$;


call abc_daily();