Snowflake JavaScript存储过程报错:空参数传入,数组参数绑定问题
Snowflake JavaScript存储过程数组参数绑定问题排查
问题场景
尝试创建接收数组参数的Snowflake JavaScript存储过程,遍历数组元素执行SELECT统计,但调用时报错empty argument passed。
原存储过程代码
CREATE OR replace PROCEDURE sproc(PRODUCT array) RETURNS varchar LANGUAGE javascript AS $$ var query = `SELECT COUNT(*) AS PRODUCT_COUNT FROM FIVETRAN.DBT_EXTERNAL_REPORTING.REVENUE WHERE SITE_ID='ksisk5kZRvk' AND PRODUCT_NAME=:1 ORDER BY 1`; var i; var out = ""; var product_count; for(i = 0; i < PRODUCT.length; i++){ out += PRODUCT[i] ; var stmt = snowflake.createStatement({sqltext: query, binds: [out]}); var result = stmt.execute(); product_count = stmt.getColumnValue(1) return product_count; result.next(); } return "Done"; $$;
调用语句
CALL sproc(array_construct('product-annual','product-monthly'));
错误信息
SQL Error [100183] [P0000]: Execution error in store procedure SPROC:
empty argument passed
At Snowflake.createStatement, line 8 position 29
问题原因
- 循环条件失效:代码中循环条件的
<被转义成了<,导致循环无法触发,初始化的空字符串out直接被作为绑定变量传入,触发空参数报错。 - 提前终止逻辑:第一次循环内的
return product_count;会直接结束存储过程,无法遍历数组所有元素。 - 结果集处理顺序错误:
getColumnValue必须在result.next()之后调用,否则无法正确获取结果值。
修正后的存储过程
CREATE OR replace PROCEDURE sproc(PRODUCT array) RETURNS varchar LANGUAGE javascript AS $$ var query = `SELECT COUNT(*) AS PRODUCT_COUNT FROM FIVETRAN.DBT_EXTERNAL_REPORTING.REVENUE WHERE SITE_ID='ksisk5kZRvk' AND PRODUCT_NAME=:1`; var resultStr = ""; for(let i = 0; i < PRODUCT.length; i++){ // 直接使用数组元素作为绑定变量 var stmt = snowflake.createStatement({sqltext: query, binds: [PRODUCT[i]]}); var result = stmt.execute(); // 先移动到结果行再取值 if(result.next()){ let product_count = result.getColumnValue(1); resultStr += `${PRODUCT[i]}: ${product_count}\n`; } else { resultStr += `${PRODUCT[i]}: 0\n`; } } return resultStr; $$;
关键修正点
- 修复循环条件的转义字符,确保循环正常执行。
- 直接传递
PRODUCT[i]作为绑定变量,避免不必要的字符串拼接导致的空值问题。 - 调整结果集处理顺序,先调用
result.next()再获取统计值。 - 移除提前返回逻辑,遍历所有数组元素并拼接结果后统一返回。
内容的提问来源于stack exchange,提问作者Felipe Hoffa
相关产品推荐
相关产品推荐

