Snowflake编写包装存储过程顺序调用多存储过程的参数传递问题
问题排查及修复方案
现有代码核心问题
- 未定义返回变量:代码末尾返回的
sql_command变量全程没有声明和赋值,运行时会直接抛出未定义变量的报错,这是最直接的运行失败原因。 - 缺少异常处理逻辑:当前代码没有错误捕获机制,任意一个子存储过程执行失败时,后续流程仍然会继续执行,且无法抛出明确的失败原因。
- 无执行状态反馈:原代码没有返回各子存储过程的执行状态,执行后无法判断是否全部运行成功。
修复后完整代码
CREATE OR REPLACE PROCEDURE SANDBOX.MERC.SP_LOAD_INCR_MERGE_DT("STARTDATE" DATE, "ENDDATE" DATE) RETURNS VARCHAR(1000000) LANGUAGE JAVASCRIPT EXECUTE AS OWNER AS ' try { // 执行第一个增量合并存储过程 let stmt = snowflake.createStatement({ sqlText: `call SANDBOX.MERC.SP_LOAD_HDR_INCR_MERGE_DT(?, ?)`, binds: [STARTDATE, ENDDATE] }); stmt.execute(); // 执行第二个增量合并存储过程 stmt = snowflake.createStatement({ sqlText: `call SANDBOX.MERC.SP_LOAD_LINEDETAIL_INCR_MERGE_DT(?, ?)`, binds: [STARTDATE, ENDDATE] }); stmt.execute(); // 执行头表日统计存储过程 stmt = snowflake.createStatement({ sqlText: `call SANDBOX.MERC.header_daily(?, ?)`, binds: [STARTDATE, ENDDATE] }); stmt.execute(); // 执行行表明细日统计存储过程 stmt = snowflake.createStatement({ sqlText: `call SANDBOX.MERC.lineitem_daily(?, ?)`, binds: [STARTDATE, ENDDATE] }); stmt.execute(); return `执行成功:所有存储过程已按顺序完成,统计区间为 ${STARTDATE} 至 ${ENDDATE}`; } catch (error) { return `执行失败:错误信息为【${error.message}】,错误代码为【${error.code}】`; } ';
可选优化项
如果遇到日期类型绑定报错,可将绑定参数统一转为YYYY-MM-DD格式的字符串再传入,修改绑定逻辑即可:
binds: [STARTDATE.toISOString().slice(0, 10), ENDDATE.toISOString().slice(0, 10)]
调用示例
call SANDBOX.MERC.SP_LOAD_INCR_MERGE_DT('2021-01-12','2021-01-14');
内容的提问来源于stack exchange,提问作者junketsu
相关产品推荐
相关产品推荐

