循环的雪花存储过程

人气:1,013 发布:2022-10-16 标签: loops stored-procedures snowflake-cloud-data-platform

问题描述

我在和Snowflake合作 我创建了这个存储过程,它的目的是执行以下步骤:

从SQL查询中提取相关的‘application_id’值 在SQL查询上使用for循环,其中包含我提取的‘APPLICATION_ID’值 在步骤1中,并从目标表中删除相关行。

当我调用存储过程时,它运行时没有错误,但不执行任何操作(相关记录未被删除)。

我添加了SP代码, 如果您看到任何语法/逻辑错误,请通知我。 谢谢

数据-lang="js"数据-隐藏="假"数据-控制台="真"数据-巴贝尔="假">
CREATE OR REPLACE PROCEDURE DWH.sp_testing()
RETURNS string
LANGUAGE javascript
strict
EXECUTE AS owner
AS
$$

try 
{
    var application_list = ` SELECT  application_id
                             FROM PUBLIC.my_source_table_name
                             WHERE my_flag = 1
                           `

    var query_statement = snowflake.createStatement({sqlText: application_list});
    var application_list_result = query_statement.execute();

    for (i = 1; i <= query_statement.getRowCount(); i++) 
    {
        application_list_result.next()
        application_id = application_list_result.getColumnValue(1)   
         

        var delete_daily_records = `
                                DELETE FROM PUBLIC.my_target_table_name AS target
                                WHERE target.application_id = ${application_id}
                            `

        snowflake.execute({sqlText: delete_daily_records});
    }

}

catch (err) 
{
    throw "Failed: " + err; 
}

$$
;

CALL DWH.sp_testing();

推荐答案

是否确定查询正在返回数据?另外,您确定目标表具有与您的DELETE语句匹配的数据吗?

以下测试适用于我使用您的存储过程:

select count(*) from citibike_trips where end_station_id=6215;

退货:14565

现在,我创建了您的存储进程:

CREATE OR REPLACE PROCEDURE sp_testing()
RETURNS string
LANGUAGE javascript
strict
EXECUTE AS owner
AS
$$

try 
{
    var application_list = `SELECT  end_station_id
                            FROM citibike_trips
                            WHERE end_station_id=6215 limit 10
                           `

    var query_statement = snowflake.createStatement({sqlText: application_list});
    var application_list_result = query_statement.execute();

    for (i = 1; i <= query_statement.getRowCount(); i++) 
    {
        application_list_result.next()
        end_station_id = application_list_result.getColumnValue(1)
        
         

        var delete_daily_records = `
                                DELETE FROM citibike_trips AS target
                                WHERE target.end_station_id = ${end_station_id}
                            `

        snowflake.execute({sqlText: delete_daily_records});
    }
}
catch (err) 
{
    throw "Failed: " + err; 
}

$$
;

运行它:

CALL SP_TESTING();

将结果显示为空(因为它不返回任何内容,因此是预期的)。 但当我再次查看表格时:

select count(*) from citibike_trips where end_station_id=6215;

退货:0

167