【发布时间】:2021-10-09 04:39:45
【问题描述】:
我有一个 plpgsql 过程,我只是试图处理任何可能的异常,因为我将在 pg_cron(自动)上运行这些过程,我不希望任何事情失败。该过程的基本框架如下所示:
CREATE OR REPLACE PROCEDURE marketing_offers.stackover_overflow_ex_question(limit_size integer)
LANGUAGE plpgsql
AS
$procedure$
DECLARE
n_rec_cnt bigint;
BEGIN
LOOP
EXIT WHEN n_rec_cnt = 0;
WITH cte AS (SELECT *
FROM master_table mt
where mt.created_date <= '1999-01-01'::time
LIMIT limit_size)
INSERT INTO some_archive_table (SELECT * FROM cte)
COMMIT;
GET DIAGNOSTICS n_rec_cnt = row_count;
RAISE EXCEPTION 'Max retry count exceeded';
begin
EXCEPTION
WHEN OTHERS then
GET STACKED DIAGNOSTICS text_var1 = message_text,
text_var2 = PG_EXCEPTION_DETAIL,
text_var3 = PG_EXCEPTION_HINT;
RAISE NOTICE 'error msg is %', text_var1;
UPDATE job_log
SET error_msg = text_var1
return;
end;
END LOOP;
END;
$procedure$
;
问题是带有text_var1 的 RAISE NOTICE,它应该保存 SQL 异常消息,从不会被记录到我的 job_log 表中应该保存该消息的 UPDATE 语句也。
我还想补充一点,我必须用另一个 begin 和 end 包围 EXCEPTION 块,因为如果不这样做,我会收到语法错误。
我只是想从我的 SQL 脚本中捕获异常 - 我应该使用不同的 EXCEPTION 类型吗?我应该寻找特定的 SQL 代码吗?我有点困惑这里的最佳做法是什么
【问题讨论】:
标签: postgresql exception stored-procedures plpgsql