Python Glue job调用Snowflake存储过程无法返回准确错误信息排查
解决方案
核心问题说明
你遇到的通用报错由两个逻辑错误导致:
- 存储过程内SQL执行成功后未提交事务,导致存储过程退出时事务仍处于活跃状态,触发事务未完成的默认报错
- catch块中
return语句写在了throw之前,return会直接终止存储过程运行,后续的错误抛出逻辑永远不会执行,外部无法拿到具体SQL错误信息 - 你示例中调用存储过程的名称和创建的名称不一致,创建的是
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
相关产品推荐
相关产品推荐

