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