Snowflake存储过程中如何获取查询返回的TABLESTATUS值做后续判断
解决方案
以下是修正后的完整可用代码,核心改动针对结果集取值和存储过程调用逻辑:
CREATE OR REPLACE PROCEDURE TEMP_KK() RETURNS STRING NOT NULL LANGUAGE JAVASCRIPT AS $$ // 执行查询获取去重的状态值 var load_status = `SELECT DISTINCT TABLESTATUS from "PLNG_ANALYSIS"."LOAD"."LET_LOAD_VERIFICATION";`; var load_check = snowflake.execute({sqlText: load_status}); var status_val = ""; // 定位到结果集第一行,确认有返回数据再取值 if (load_check.next()) { status_val = load_check.getColumnValue("TABLESTATUS"); } if (status_val === 'Complete') { // 存储过程内部调用其他存储过程,必须通过snowflake.execute执行CALL语句 snowflake.execute({sqlText: "CALL ABC();"}); snowflake.execute({sqlText: "CALL XYZ();"}); return "匹配Complete状态,后续存储过程执行完成"; } return "状态不匹配,未执行后续流程"; $$; CALL TEMP_KK();
核心逻辑说明
snowflake.execute()执行SQL后返回的是ResultSet结果集对象,无法直接和字符串做等值对比- 取值前需要先调用
.next()方法将游标移动到结果集的有效行,避免空结果报错 - 通过
.getColumnValue('字段名')方法获取对应列的实际值,此处字段名大小写需要和查询返回的字段名完全一致,也可以传入列下标(从1开始)取值,比如.getColumnValue(1) - 原代码中直接写
CALL ABC()的写法不生效,JS语法环境下执行SQL语句都需要通过snowflake.execute()封装
注意事项
你当前用了DISTINCT查询,建议先确认该查询返回的结果行数最多为1行,如果业务上可能存在多个不同的Status值,需要补充循环遍历结果集的逻辑,避免遗漏场景。
内容的提问来源于stack exchange,提问作者Nanda
相关产品推荐
相关产品推荐

