Snowflake存储过程参数传递报错:db_name未定义问题排查
问题解决:Snowflake存储过程参数引用错误
错误原因
你遇到的Uncaught ReferenceError: db_name is not defined是因为Snowflake的JavaScript存储过程中,无法直接在JS代码块里使用存储过程定义的参数名(如db_name、tbl_name),必须通过arguments对象或位置占位符$1、$2来获取传入的参数值。
修正后的代码
以下是修复参数引用问题,并调整SQL拼接逻辑的存储过程:
create or replace procedure execute_sql_command(db_name varchar,tbl_name varchar) returns string language javascript as $$ // 通过arguments对象获取传入的参数 var target_database = arguments[0]; var target_table = arguments[1]; // 生成正确的Pipe创建语句框架,可根据需求扩展完整配置 var sql_string = `CREATE OR REPLACE PIPE ${target_database}.public.${target_table}`; // 示例:带自动 ingestion和COPY逻辑的完整Pipe定义 // var sql_string = `CREATE OR REPLACE PIPE ${target_database}.public.${target_table} AUTO_INGEST = TRUE AS COPY INTO ${target_database}.public.${target_table} FROM @${target_database}.public.my_stage FILE_FORMAT = (TYPE = 'CSV')`; // 执行语句并返回结果 var res = snowflake.createStatement({sqlText: sql_string}); res.execute(); return `已生成Pipe创建语句: ${sql_string}`; $$; call execute_sql_command('dev_stage_db','miattr');
关键说明
- 参数获取:JS代码中
arguments[0]对应第一个输入参数db_name,arguments[1]对应第二个参数tbl_name;也可以直接用$1、$2替代,效果完全一致。 - SQL拼接:原代码的
concat(rtrim(...))逻辑冗余且易出错,使用字符串模板(反引号`)拼接更简洁,还能避免引号嵌套问题。 - 扩展配置:如果需要添加自动 ingestion、关联Stage、指定文件格式等Pipe属性,直接在
sql_string中补充对应的Snowflake语法即可,示例中已给出参考注释。
内容的提问来源于stack exchange,提问作者Anton S.
相关产品推荐
相关产品推荐

