如何确保Redshift嵌套存储过程全执行,即使单个过程失败
在Redshift中实现子存储过程的容错执行
Redshift虽然不支持try/catch语法,但它兼容PL/pgSQL的BEGIN...EXCEPTION异常处理块,你可以把每个子存储过程的调用单独包裹在独立的异常块里,这样就算某个子过程执行失败,也不会中断整个主过程,剩下的子过程依然能正常运行。
修改后的存储过程代码如下:
CREATE OR REPLACE PROCEDURE public.a() LANGUAGE plpgsql AS $$ BEGIN -- 调用public.abc(),捕获执行异常 BEGIN CALL public.abc(); EXCEPTION WHEN OTHERS THEN -- 打印错误提示,也可以替换为写入日志表 RAISE NOTICE 'public.abc()执行失败: %', SQLERRM; END; -- 调用public.abc1(),捕获执行异常 BEGIN CALL public.abc1(); EXCEPTION WHEN OTHERS THEN RAISE NOTICE 'public.abc1()执行失败: %', SQLERRM; END; -- 调用public.abc2(),捕获执行异常 BEGIN CALL public.abc2(); EXCEPTION WHEN OTHERS THEN RAISE NOTICE 'public.abc2()执行失败: %', SQLERRM; END; END; $$;
关键说明:
- 每个子过程的调用都放在独立的
BEGIN...END块中,搭配EXCEPTION捕获异常,这样单个子过程的错误不会影响其他子过程的执行 WHEN OTHERS会捕获所有类型的异常,你也可以指定具体异常类型(比如WHEN division_by_zero)做针对性处理SQLERRM是PL/pgSQL内置变量,直接返回异常的错误描述信息- 如果需要留存错误记录,你可以把
RAISE NOTICE换成插入自定义日志表的语句,方便后续排查问题
内容的提问来源于stack exchange,提问作者powerofthunder
相关产品推荐
相关产品推荐

