Snowflake存储过程报错:绑定变量未设置问题求助
Snowflake存储过程调用报错:snowflake bind variable not set
创建了如下Snowflake SQL存储过程,创建成功,但调用时提示snowflake bind variable not set错误。
存储过程代码
CREATE OR REPLACE PROCEDURE some_proc_name("LOAD_MONTH" INTEGER, "LOAD_YEAR" INTEGER) RETURNS VARCHAR(16777216) LANGUAGE SQL EXECUTE AS CALLER AS declare result string; v_EXTRACT_DATE DATE; cur CURSOR FOR SELECT distinct EXTRACT_DATE FROM some_table_name where month(EXTRACT_DATE) = :LOAD_MONTH and year(EXTRACT_DATE) = :LOAD_YEAR; begin return 'SUCCESS'; end;
调用代码
call some_proc_name(1,2025);
错误信息
调用时触发错误:snowflake bind variable not set
已尝试的解决方法(均无效)
- 将
:LOAD_MONTH替换为identifier(:LOAD_MONTH) - 移除
LOAD_MONTH参数的引号 - 将
cur变量移至begin块内用let cur定义
正确解决方案
问题根源在于declare块中定义的游标无法直接引用存储过程参数作为绑定变量,因为declare块的解析时机早于参数绑定流程。需将游标定义移至begin块内,并通过USING子句传递参数,修改后的代码如下:
CREATE OR REPLACE PROCEDURE some_proc_name("LOAD_MONTH" INTEGER, "LOAD_YEAR" INTEGER) RETURNS VARCHAR(16777216) LANGUAGE SQL EXECUTE AS CALLER AS declare result string; v_EXTRACT_DATE DATE; begin -- 将游标定义移至begin块内,使用?占位符+USING传递参数 let cur CURSOR FOR SELECT distinct EXTRACT_DATE FROM some_table_name where month(EXTRACT_DATE) = ? and year(EXTRACT_DATE) = ? USING (:LOAD_MONTH, :LOAD_YEAR); return 'SUCCESS'; end;
内容的提问来源于stack exchange,提问作者lil-wolf
相关产品推荐
相关产品推荐

