使用存储过程的 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 中的行

BigQuery 避免多个子查询

在 Bigquery 中为多个 CSV 文件自动创建表

Bigquery 使用 Union All 和通配符删除查询

我们是不是可以检查 bigquery 中的表是不是处于锁定状态或正在执行 DML 操作

SQL Server:在存储过程中的变量中存储多个值