Я новичок в снежинках и только что попытался создать хранимую процедуру для чтения дельт из потоковой таблицы A и выполнения двух операторов слияния в таблицы B и C, но я продолжаю получать это сообщение об ошибке "Multiple SQL statements in a single API call are not supported; use one API call per statement instead."
Вот моя хранимая процедура. Идея состоит в том, чтобы вызвать его из задачи when system$stream_has_data('tableA')
create or replace procedure write_delta()
return varchar
language sql as
$$
begin transaction;
-- 1/2. load table B
merge into tableB as dest
using tableA as src
on src.id = dest.id
when not matched
then insert (id, value) values( src.id, src.value);
-- 2/2. load tableC
merge into tableC as dest
using tableA as src
on src.id = dest.id
when not matched
then insert (id, value) values( src.id, src.value);
commit;
$$;
Хранимые процедуры Snowflake SQL имеют две формы.
Форма 1: один оператор SQL. Это в основном полезно при вызове из задачи для выполнения одного оператора.
Форма 2: Блок сценариев Snowflake. Следующий сценарий показывает ваш код, преобразованный в хранимую процедуру с блоком сценария:
create or replace table table1 (id int, value string);
create or replace table tableB like table1;
create or replace table tableC like table1;
create or replace stream tableA on table table1;
insert into table1(id, value) values (1, 'A'), (2, 'B');
create or replace procedure myprocedure()
returns varchar
language sql
as
$$
begin
begin transaction;
-- 1/2. load table B
merge into tableB as dest
using tableA as src
on src.id = dest.id
when not matched
then insert (id, value) values( src.id, src.value);
-- 2/2. load tableC
merge into tableC as dest
using tableA as src
on src.id = dest.id
when not matched
then insert (id, value) values( src.id, src.value);
commit;
end;
$$
;
call myprocedure();
select * from tableB;
select * from tableC;
Вы можете получить больше информации о том, как их написать здесь: https://docs.snowflake.com/en/developer-guide/snowflake-scripting/index.html
Если вы хотите выполнить несколько операторов, вам нужно запустить хранимую процедуру с помощью сценариев Snowflake Scripting, JavaScript, Java или Python.
спасибо, я вижу, что пропустил начало и конец транзакции. Еще раз спасибо!