BigQuery存储过程SQL%RowFound



如何检查存储过程中的SQL语句是否成功返回了一行或多行。下面是我的存储过程,我将检查特定表是否有重复项。我不知道如何在存储过程中编写IF语句

CREATE OR REPLACE PROCEDURE my_project.LOGGING.check_dup_prc(project_name STRING, data_set_name STRING, table_name STRING, date_id DATE, cols STRING,OUT found_duplicates STRING) 
BEGIN DECLARE sql STRING; 
set sql ='Select date,'||cols||','||'count(1) from '||project_name||'.'||data_set_name||'.'||table_name|| ' where date=''||date_id || '' GROUP BY date,'||cols||'HAVING COUNT(*)>1'; 
EXECUTE IMMEDIATE (SQL); 
if SQL%ROWSFOUND THEN
found_duplicates ='Y'
ELSE 
found_duplicates='N'
END;
END;

我建议将sql写为:

DECLARE rowsFound BOOL;
set sql ='Select count(*) > 0 from '||project_name||'.'||data_set_name||'.'||table_name|| ' where date=@date_id GROUP BY date,'||cols; 
EXECUTE IMMEDIATE (SQL) INTO rowsFound USING date_id AS date_id; 

请注意,date_id也作为参数@date_id传入,这始终是推荐的。

您还可以从公共文档中找到有关EXECUTE IMMEDIATE的INTOUSING的更多信息。

您还应该调整sql,以确保它只吐出1行,从而使INTO工作。

更新:如果您需要捕获多行

DECLARE rowsFound ARRAY<BOOL>;
SET sql ='Select <some_array>'; 
EXECUTE IMMEDIATE (SQL) INTO rowsFound; 

最新更新