Snowflake存储过程报upd_stmnt.getSqlText is not a function错误求助
Snowflake JS存储过程
upd_stmnt.getSqlText is not a function错误排查 核心错误点
- Statement对象创建方式错误(直接触发报错):Snowflake的
snowflake.createStatement()方法要求传入格式为{sqlText: "SQL语句字符串"}的配置对象,你在创建更新语句的Statement时,直接传入了拼接好的SQL字符串,没有包裹成带sqlText属性的对象,生成的upd_stmnt不是合法的Statement实例,本身不存在getSqlText方法,调用时直接抛出类型错误。 - 空值判断逻辑完全失效(导致代码走到报错分支):你写的判断条件
if(('v_name' + i).length == 0)是在计算固定字符串v_name1/v_name2的长度,这两个字符串长度固定为6,永远不可能等于0,所以if分支永远不会执行,每次循环都会直接进入else分支尝试调用upd_stmnt.getSqlText()。 - 变量作用域缺陷:
upd_stmnt变量是在if块内部定义的,由于if分支永远不触发,upd_stmnt从来没有被实际赋值过,就算修正了createStatement的传参问题,这里也会报变量未定义错误。 - SQL拼接风险:直接拼接字符串生成更新语句,没有做特殊字符转义,如果字段值包含单引号会直接触发SQL语法错误,且逐行提交更新的性能很差。
修正后可直接运行的代码
create or replace procedure tbl_update() returns varchar not null language javascript as $$ var select_sql = {sqlText: `select id, name, name1, name2 from tbl;`}; var select_stmnt = snowflake.createStatement(select_sql); var select_result = select_stmnt.execute(); var select_rec_cnt = select_result.getRowCount(); if(select_rec_cnt > 0) { while (select_result.next()) { var v_id = select_result.getColumnValue(1); var v_name = select_result.getColumnValue(2); var v_name1 = select_result.getColumnValue(3); var v_name2 = select_result.getColumnValue(4); for (var i = 1; i <= 2; i++) { // 动态获取当前循环对应的name1/name2字段值 var currentFieldVal = this['v_name' + i]; // 正确判断空值:兼容null和空字符串场景 if(currentFieldVal == null || currentFieldVal.trim().length == 0) { // 按规范传入sqlText配置,使用绑定变量避免SQL注入和转义问题 var upd_sql = `UPDATE tbl SET name${i} = ? WHERE id = ?;`; var upd_stmnt = snowflake.createStatement({ sqlText: upd_sql, binds: [v_name, v_id] }); upd_stmnt.execute(); } } } return 'done'; } else { return 'No records to process'; } $$
性能优化提示:如果不需要复杂JS逻辑,可以直接用单条SQL实现需求,不需要循环逐行处理,执行效率远高于JS存储过程逐行循环,对应逻辑为:先更新name1为空的行,再更新name2为空的行,把空字段赋值为同列name的值。
内容的提问来源于stack exchange,提问作者user19184678
相关产品推荐
相关产品推荐

