【问题标题】:BigQuery Stored Procedure SQL%RowFoundBigQuery 存储过程 SQL%RowFound
【发布时间】:2020-12-04 01:15:49
【问题描述】:

如何检查存储过程中的 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;

【问题讨论】:

    标签: stored-procedures google-bigquery bigquery-udf


    【解决方案1】:

    我建议把 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 传入的,始终建议这样做。

    您还可以从public documentation 找到有关INTOUSING 的更多信息,以便立即执行。

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

    更新:以防您需要捕获多行

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

    【讨论】:

    • 嗨,如果查询返回多行,我应该使用什么变量来捕获所有结果?
    • 在我的回答中添加了一个示例
    猜你喜欢
    • 1970-01-01
    • 2021-12-28
    • 1970-01-01
    • 2012-07-12
    • 2018-05-08
    • 1970-01-01
    相关资源
    最近更新 更多