Snowflake存储过程含多Merge语句报错:单API调用不支持多SQL语句
Snowflake存储过程多Merge语句报错解决办法
报错原因
你遇到的"Multiple SQL statements in a single API call are not supported; use one API call per statement instead."错误,核心原因是SQL语言的存储过程不支持在代码块中直接编写多个独立SQL语句,必须通过指定方式逐个执行。
解决方案1:改用JavaScript存储过程
JavaScript存储过程对多SQL语句的支持更灵活,可直接执行每个Merge操作:
create or replace procedure write_delta() returns varchar language javascript as $$ // 写入tableB snowflake.execute({ sqlText: `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);` }); // 写入tableC snowflake.execute({ sqlText: `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);` }); return '增量数据写入完成'; $$;
解决方案2:SQL存储过程中用EXECUTE IMMEDIATE执行语句
如果坚持使用SQL存储过程,需要将每个Merge语句用EXECUTE IMMEDIATE包裹,显式执行:
create or replace procedure write_delta() returns varchar language sql as $$ begin // 执行tableB的Merge execute immediate ' 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); '; // 执行tableC的Merge execute immediate ' 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); '; return '增量数据写入完成'; end; $$;
额外说明
- 原代码中的
begin transaction和commit可省略,Snowflake存储过程默认会将过程内所有操作放在一个事务中执行。 - 任务触发条件
when system$stream_has_data('tableA')可正常使用,不受存储过程修改影响。
内容的提问来源于stack exchange,提问作者PaCi
相关产品推荐
相关产品推荐

