Snowflake 循环存储过程
Snowflake Stored Procedure For Loop
我正在使用 Snowflake,
我创建了这个存储过程,它的目的是执行以下步骤:
- 从 SQL 查询中提取相关的 'application_id' 值
- 在 SQL 查询上使用 FOR 循环,使用我提取的 'application_id' 值
在第 1 步中,从目标 table.
中删除相关行
当我调用存储过程时,它运行没有错误,但它没有做任何事情(相关记录没有被删除)。
我添加了我的 SP 代码,
如果您看到任何语法/逻辑错误,请告诉我,
谢谢
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();
您确定您的查询正在返回数据吗?您还确定目标 table 具有与您的 DELETE 语句匹配的数据吗?
使用您的存储过程,以下测试对我有效:
select count(*) from citibike_trips where end_station_id=6215;
returns: 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();
结果显示为 NULL(预期,因为它没有返回任何内容)。
但是当我再次检查 table 时:
select count(*) from citibike_trips where end_station_id=6215;
returns: 0
我正在使用 Snowflake, 我创建了这个存储过程,它的目的是执行以下步骤:
- 从 SQL 查询中提取相关的 'application_id' 值
- 在 SQL 查询上使用 FOR 循环,使用我提取的 'application_id' 值 在第 1 步中,从目标 table. 中删除相关行
当我调用存储过程时,它运行没有错误,但它没有做任何事情(相关记录没有被删除)。
我添加了我的 SP 代码, 如果您看到任何语法/逻辑错误,请告诉我, 谢谢
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();
您确定您的查询正在返回数据吗?您还确定目标 table 具有与您的 DELETE 语句匹配的数据吗?
使用您的存储过程,以下测试对我有效:
select count(*) from citibike_trips where end_station_id=6215;
returns: 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();
结果显示为 NULL(预期,因为它没有返回任何内容)。 但是当我再次检查 table 时:
select count(*) from citibike_trips where end_station_id=6215;
returns: 0