Snowflake中如何将存储过程返回值赋值给变量及报错解决
Snowflake存储过程调用及赋值问题解决
你的报错核心原因是调用first_proc时传入的table1未定义,同时Snowflake SQL存储过程中调用其他存储过程并获取返回值的语法有误,还存在多处语法细节问题。以下是问题梳理和修正后的完整代码:
问题点梳理
- 调用
first_proc时无合法参数:table1是first_proc的入参,但second_proc里既没定义这个变量,也没传入具体值 - 存储过程返回值获取语法错误:SQL存储过程不能直接用
script := call first_proc(...)赋值,需结合RESULT_SCAN获取返回结果 - 基础语法错误:语句末尾缺分号、
insert语句拼写错误(应为insert into和values)、使用了中文引号(需替换为英文引号) first_proc逻辑问题:select row into val from employees中的row不是合法列名,需替换为具体列或聚合函数(比如统计行数的count(*))
修正后的代码
第一个存储过程(修正逻辑与语法)
create or replace procedure first_proc(table1 varchar) returns varchar language sql as declare val int; begin -- 示例:获取目标表的行数,替换为你实际需要的逻辑 select count(*) into val from identifier(:table1); if (val = 0) then return 'yes'; else return 'NO'; end if ; end;
第二个存储过程(修正调用赋值与语法)
create or replace procedure second_proc() returns varchar language sql as declare script varchar; -- 定义传入first_proc的目标表名,替换为你实际需要的表名 target_table varchar := 'employees'; begin -- 避免重复创建表,先判断表是否存在 if not exists (select 1 from information_schema.tables where table_name = 'SCHOOLTABLE') then create table schoolTable (schooldt datetime); end if; -- 调用第一个存储过程 call first_proc(target_table); -- 通过RESULT_SCAN获取上一次调用的返回结果并赋值 select $1 into script from table(result_scan(last_query_id())); if script = 'yes' then insert into schoolTable values ('2024-01-01 00:00:00'::datetime); else return '表行数不为0,执行终止'; end if; return '执行成功'; end;
关键说明
- 获取返回值:Snowflake SQL存储过程中,调用其他存储过程后,必须用
RESULT_SCAN(last_query_id())读取返回结果,再通过select ... into赋值给变量 - 参数传递:调用
first_proc时要传入已定义的变量或具体字符串值,示例中用target_table变量传入目标表名 - 语法规范:所有语句末尾加英文分号,统一使用英文引号,
insert语句遵循insert into ... values(...)格式 - 防重复建表:添加表存在性判断,避免重复执行存储过程时触发建表报错
内容的提问来源于stack exchange,提问作者JRYO
相关产品推荐
相关产品推荐

