Хранимая процедура 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;

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, это всегда рекомендуется.

Вы также можете узнать больше о INTO и USINGдля EXECUTE IMMEDIATE из общедоступной документации.

Вы также должны настроить sql, чтобы убедиться, что он выплевывает только 1 строку, чтобы сделать INTO Работа.

Обновление: если вам нужно захватить более одной строки

DECLARE rowsFound ARRAY<BOOL>;

SET sql ='Select <some_array>'; 
EXECUTE IMMEDIATE (SQL) INTO rowsFound; 
Другие вопросы по тегам