簡體   English   中英

BigQuery 存儲過程 SQL%RowFound

[英]BigQuery Stored Procedure 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 傳入,始終建議這樣做。

您還可以從公共文檔中找到有關INTOUSING for EXECUTE IMMEDIATE 的更多信息。

您還應該調整 sql 以確保它只吐出 1 行以使INTO工作。

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

DECLARE rowsFound ARRAY<BOOL>;

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM