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

Snowflake存储过程绑定参数类型不支持错误排查求助

Snowflake存储过程执行报错排查与修复

存储过程代码

CREATE OR REPLACE PROCEDURE test1(source_name VARCHAR,wf_name VARCHAR,wf_start_time datetime,wf_end_time datetime,wf_status VARCHAR,wf_flag VARCHAR)
    RETURNS VARCHAR
    LANGUAGE JAVASCRIPT
    AS
    $$
      
    var cmd = `INSERT INTO DATA.IWX_JOB_LOG
               (SOURCE,
               WF_NAME,
               WF_START_TIME,
               WF_END_TIME,
               WF_STATUS
               )
               
               SELECT
               (?,?,date(?),date(?),?);`
    var stmt = snowflake.createStatement(
              {
              sqlText: cmd,
              binds: [SOURCE_NAME,WF_NAME,WF_START_TIME,WF_END_TIME,WF_STATUS]
              }
              );
    var result1 = stmt.execute();


$$
;

调用语句

CALL test1('test','test',getdate(),getdate(),'running','I')

目标表结构

nametype
SOURCEvarchar(50)
WF_NAMEvarchar(50)
WF_START_TIMEdatetime
WF_END_TIMEdatetime
WF_STATUSvarchar(50)

执行错误信息

Execution error in stored procedure TEST1: Unsupported type for binding argument 2undefined At Snowflake.createStatement, line 13 position 21


错误原因分析

  1. 参数大小写不匹配:JavaScript是大小写敏感语言,存储过程定义的参数为小写开头(如source_name),但代码中使用大写名称(SOURCE_NAME),导致变量未定义,绑定参数时出现undefined,触发类型不支持的报错。
  2. INSERT语句语法错误:SELECT子句中用括号包裹绑定变量的写法不符合Snowflake语法,且无需对已传入的datetime参数再用date()转换(若需存储日期,直接传入CURRENT_DATE即可)。
  3. 冗余参数:存储过程定义了wf_flag参数,但代码中未使用,虽不直接导致报错,但属于冗余定义。

修正方案

方案1:修正参数大小写与SQL语法(保留原参数)

CREATE OR REPLACE PROCEDURE test1(source_name VARCHAR, wf_name VARCHAR, wf_start_time datetime, wf_end_time datetime, wf_status VARCHAR, wf_flag VARCHAR)
RETURNS VARCHAR
LANGUAGE JAVASCRIPT
AS
$$
var cmd = `INSERT INTO DATA.IWX_JOB_LOG
           (SOURCE, WF_NAME, WF_START_TIME, WF_END_TIME, WF_STATUS)
           SELECT ?, ?, ?, ?, ?;`;

var stmt = snowflake.createStatement({
    sqlText: cmd,
    binds: [source_name, wf_name, wf_start_time, wf_end_time, wf_status]
});

stmt.execute();
return '数据插入成功';
$$;

若需存入current_date,调用语句改为:

CALL test1('test','test',CURRENT_DATE(),CURRENT_DATE(),'running','I');

方案2:直接在存储过程中使用CURRENT_DATE(移除冗余日期参数)

如果无需动态传入日期,可直接在SQL中指定CURRENT_DATE,简化存储过程:

CREATE OR REPLACE PROCEDURE test1(source_name VARCHAR, wf_name VARCHAR, wf_status VARCHAR, wf_flag VARCHAR)
RETURNS VARCHAR
LANGUAGE JAVASCRIPT
AS
$$
var cmd = `INSERT INTO DATA.IWX_JOB_LOG
           (SOURCE, WF_NAME, WF_START_TIME, WF_END_TIME, WF_STATUS)
           SELECT ?, ?, CURRENT_DATE(), CURRENT_DATE(), ?;`;

var stmt = snowflake.createStatement({
    sqlText: cmd,
    binds: [source_name, wf_name, wf_status]
});

stmt.execute();
return '数据插入成功';
$$;

调用语句简化为:

CALL test1('test','test','running','I');

内容的提问来源于stack exchange,提问作者coool_sweet

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 07:25:16