You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 15:30:56