Snowflake JS存储过程执行报getSqlText未定义错误求助修复
报错根因
- 变量初始化时机问题
你仅在try代码块内部为rs变量赋值,若snowflake.createStatement或rs.execute()执行过程中抛出异常,代码会进入catch分支,但由于异常可能在rs完成赋值前触发,此时rs仍为undefined。部分异常场景下会走到外部的return rs.getSqlText()逻辑,最终触发调用undefined方法的报错。 - SQL参数绑定错误(隐藏问题)
你直接将存储过程输入参数名写在SQL语句中,且参数名与表字段名完全一致,SQL解析器会将两侧都识别为表字段,变成恒真条件,无法实现按输入参数过滤的预期效果,同时也存在SQL注入风险。
修复方案
调整变量声明位置,将rs提到try块外部提前声明,同时使用Snowflake官方推荐的参数绑定语法传递输入参数,修复后的完整存储过程代码如下:
create or replace procedure test_09172(c_custkey varchar(25) ,c_mktsegment varchar(25) ,cname varchar(25)) returns string not null language javascript execute as owner as $$ var sqlquery = ""; var fltConvUomPK = ""; var fltConvFactorPK = ""; var ParentClass = ""; var VMAJOR = ""; var VMINOR = ""; var rs; // 提前声明rs变量 try { var sql_command = `SELECT C_ADDRESS,C_NATIONKEY from customers WHERE c_custkey = ? and c_name = ? and C_MKTSEGMENT = ?`; // 创建语句时绑定参数 rs = snowflake.createStatement({ sqlText: sql_command, binds: [C_CUSTKEY, CNAME, C_MKTSEGMENT] }); var result_set1 = rs.execute(); return rs.getSqlText(); // 成功执行后直接在try块内返回 } catch(err) { return err.message; } $$;
调用逻辑保持不变即可:
call test_09172('537289','FURNITURE','Customer#000537289');
内容的提问来源于stack exchange,提问作者user16595206
相关产品推荐
相关产品推荐

