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')
目标表结构
| name | type |
|---|---|
| SOURCE | varchar(50) |
| WF_NAME | varchar(50) |
| WF_START_TIME | datetime |
| WF_END_TIME | datetime |
| WF_STATUS | varchar(50) |
执行错误信息
Execution error in stored procedure TEST1: Unsupported type for binding argument 2undefined At Snowflake.createStatement, line 13 position 21
错误原因分析
- 参数大小写不匹配:JavaScript是大小写敏感语言,存储过程定义的参数为小写开头(如
source_name),但代码中使用大写名称(SOURCE_NAME),导致变量未定义,绑定参数时出现undefined,触发类型不支持的报错。 - INSERT语句语法错误:SELECT子句中用括号包裹绑定变量的写法不符合Snowflake语法,且无需对已传入的datetime参数再用
date()转换(若需存储日期,直接传入CURRENT_DATE即可)。 - 冗余参数:存储过程定义了
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
相关产品推荐
相关产品推荐

