使用存储过程的 bigquery 中的多个删除操作
Posted
技术标签:
【中文标题】使用存储过程的 bigquery 中的多个删除操作【英文标题】:Multiple delete operation in bigquery using a stored procedure 【发布时间】:2020-02-25 13:00:07 【问题描述】:我需要从表中删除行。删除操作可以有不同的期限和不同的条件,那么我想使用存储过程来产生动态删除语句。
删除语句的条件存储在如下表中:
dataset.delete_conditions:
group lower_event_limit upper_event_limit
A. 2020-02-01 2020-02-10
B 2020-01-01 2020-01-03
C 2020-02-05 2020-02-07
我想制作这样的东西:
CREATE PROCEDURE delete_irrelevant_data(s_group STRING, d_lower_event_limit DATE, d_upper_event_limit DATE)
BEGIN
IF d_lower_event_limit IS NOT NULL AND d_upper_event_limit IS NOT NULL
THEN
delete from data_set.fact_table
where date between d_lower_event_limit AND d_upper_event_limit
and group = s_group;
END IF;
END;
select
delete_irrelevant_data(group, lower_event_limit, upper_event_limit)
from
( select group,
lower_event_limit,
upper_event_limit
from dataset.delete_conditions
)
它不起作用。 我想我需要使用数组和循环,但我无法制定它。
【问题讨论】:
【参考方案1】:该错误似乎与需要调用 CALL 的 procedures 有关。我认为您可以为此使用scripting。例如:
-- Get the delete conditions
DECLARE delete_conditions DEFAULT (ARRAY(SELECT AS STRUCT sgroup,
lower_event_limit,
upper_event_limit
from my_dataset.delete_conditions));
-- Declare variable for the loop
DECLARE size DEFAULT (SELECT ARRAY_LENGTH(delete_conditions));
DECLARE i DEFAULT 0;
DECLARE conditions DEFAULT (delete_conditions[OFFSET(0)]);
-- Create or repleace procedure. This can be done outside of the script
CREATE OR REPLACE PROCEDURE my_dataset.delete_irrelevant_data(s_group STRING, d_lower_event_limit DATE, d_upper_event_limit DATE)
BEGIN
DELETE FROM my_dataset.my_table_to_delete WHERE sgroup = s_group; -- And additional conditions
END;
-- Loop
WHILE i < size DO
SET conditions = delete_conditions[OFFSET(i)];
-- Procedures are invoked by using CALL
CALL my_dataset.delete_irrelevant_data(conditions.sgroup, conditions.lower_event_limit, conditions.upper_event_limit);
SET i = i+1;
END WHILE;
另外需要考虑的是,使用这种方法,您可能会遇到一些quotas,因此,如果您正在执行大量删除操作,您还可以尝试在执行 DELETE 语句之前对一些删除操作进行分组。
【讨论】:
以上是关于使用存储过程的 bigquery 中的多个删除操作的主要内容,如果未能解决你的问题,请参考以下文章
Bigquery 使用 Union All 和通配符删除查询