You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python Glue job调用Snowflake存储过程无法返回准确错误信息排查

解决方案

核心问题说明

你遇到的通用报错由两个逻辑错误导致:

  1. 存储过程内SQL执行成功后未提交事务,导致存储过程退出时事务仍处于活跃状态,触发事务未完成的默认报错
  2. catch块中return语句写在了throw之前,return会直接终止存储过程运行,后续的错误抛出逻辑永远不会执行,外部无法拿到具体SQL错误信息
  3. 你示例中调用存储过程的名称和创建的名称不一致,创建的是PROC_TEST,调用时写的是TEST_PROC,需要修正拼写错误

调整后的存储过程代码

create or replace procedure schema.PROC_TEST 
    (input_sql varchar(16777216))
returns string not null
language javascript
as
$$
snowflake.execute({sqlText:`BEGIN TRANSACTION;`});
try
{
    var QueryExec = INPUT_SQL + ";";
    snowflake.execute({sqlText: QueryExec});
    // 执行成功主动提交事务
    snowflake.execute({sqlText:`COMMIT;`});
    return 'SUCCESS';
}
catch (err)
{
    // 出错先回滚事务
    snowflake.execute({sqlText:`ROLLBACK;`});
    // 直接抛出原始错误,不要在throw前加return语句
    throw err;
}
$$;

调整后的Glue Job代码

原有捕获逻辑无需大改,替换为参数化查询避免输入SQL中存在单引号时的语法报错:

import sys
import snowflake.connector

input_sql = 'insert into schema.proc_test_final1 select id, name, sal from schema.proc_test_src'
try:
    # 参数化调用避免转义问题,同时修正存储过程名称
    f_CallProc = "call schema.PROC_TEST(%s)"
    cur.execute(f_CallProc, (input_sql,))
    print(cur.fetchall())
    cur.close()
    ctx.close()
except snowflake.connector.errors.ProgrammingError as err:
    # 此处可直接捕获到存储过程抛出的原始SQL错误,如表不存在、语法错误等
    print('Error: {0} ({1})'.format(err.msg, err.sfqid))
    cur.close()
    ctx.close()
    sys.exit(1)

调整后即可在Glue运行日志中拿到具体的SQL执行错误,同时Glue作业会按需求触发失败。

内容的提问来源于stack exchange,提问作者Rohit Kadam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 15:15:04