Snowflake存储过程使用绑定变量报错:‘full_table_name’未设置绑定变量
Snowflake存储过程绑定变量报错:Bind variable for object "full_table_name" not set 解决方法
你的问题出在对存储过程参数、本地变量的引用语法错误,以及IDENTIFIER函数的使用方式不当,以下是具体修正方案:
错误原因拆解
- DECLARE块参数引用错误:SQL存储过程内部引用入参时,直接用参数名即可,不需要加冒号
:table_name——冒号是外部绑定变量的语法,不适用于存储过程内部的参数调用。 - IDENTIFIER函数变量引用错误:
full_table_name是你定义的本地变量,引用时不需要加冒号,加冒号会被Snowflake判定为未定义的外部绑定变量,触发报错。
修正后的完整代码
CREATE OR REPLACE PROCEDURE db.schema.sp_1(table_name VARCHAR) RETURNS VARCHAR NOT NULL LANGUAGE SQL AS $$ DECLARE -- 直接使用参数名table_name,无需冒号 full_table_name VARCHAR DEFAULT CONCAT('db.schema.', table_name); select_statement VARCHAR; result_select_statement RESULTSET; BEGIN -- IDENTIFIER中直接引用本地变量full_table_name,无需冒号 select_statement := 'SELECT SUM(NVL(flag,0)) flg_sum FROM ' || IDENTIFIER(full_table_name); result_select_statement := (EXECUTE IMMEDIATE select_statement); LET c1 CURSOR FOR result_select_statement; FOR row_variable IN c1 DO -- 补充你的后续业务逻辑 RETURN row_variable.flg_sum::VARCHAR; END FOR; RETURN '0'; END; $$;
更安全的写法(推荐)
如果要避免字符串拼接可能带来的注入风险,可以用EXECUTE IMMEDIATE的USING子句传递变量,写法如下:
CREATE OR REPLACE PROCEDURE db.schema.sp_1(table_name VARCHAR) RETURNS VARCHAR NOT NULL LANGUAGE SQL AS $$ DECLARE full_table_name VARCHAR DEFAULT CONCAT('db.schema.', table_name); select_statement VARCHAR; result_select_statement RESULTSET; BEGIN select_statement := 'SELECT SUM(NVL(flag,0)) flg_sum FROM IDENTIFIER(?)'; -- 通过USING传递变量给占位符? result_select_statement := (EXECUTE IMMEDIATE select_statement USING full_table_name); LET c1 CURSOR FOR result_select_statement; FOR row_variable IN c1 DO RETURN row_variable.flg_sum::VARCHAR; END FOR; RETURN '0'; END; $$;
内容的提问来源于stack exchange,提问作者Robertino Bonora
相关产品推荐
相关产品推荐

