首页 > 解决方案 > 其他异常时登录postgresql

问题描述

数据库:RDS PostgreSQL 12 我有一个错误的简单过程。当它出错时,我想记录它,然后引发异常。但是我只能让它做其中一件事。我可以让它记录错误,也可以引发异常。我已经尝试过直接从异常块插入记录,或者通过调用将记录插入表中的过程。我怎样才能让它两者兼得?我将发布下面两个块的代码。任何帮助,将不胜感激!

CREATE OR REPLACE PROCEDURE error_test_prc () 
 LANGUAGE plpgsql
AS $body$
DECLARE
    var1 int;
BEGIN
    SELECT 10/0 INTO var1;
EXCEPTION 
    WHEN OTHERS THEN 
        --INSERT INTO mdm_raw.raw_err_msg(msg_date, msg) VALUES(current_date, 'test');
        CALL mdm_raw.error_logging_prc('this is a different proc test');
        RAISE EXCEPTION 'Caught in Block 1 %', SQLERRM;
END;
$body$
CREATE OR REPLACE PROCEDURE error_logging_prc (msg_text text) 
 LANGUAGE plpgsql
AS $body$
DECLARE
    var1 int;
BEGIN
    INSERT INTO mdm_raw.raw_err_msg(msg_date, msg) VALUES(current_date, msg_text);
EXCEPTION 
    WHEN OTHERS THEN 
        RAISE EXCEPTION 'Error Caught in error_logging_prc %', SQLERRM;
END;
$body$

标签: postgresql

解决方案


您可以通过回滚当前事务来完成此操作,然后插入并提交您的日志。请参阅以下过程中标有 --<<<<< 的行。另一个是设置一个 dblink。

CREATE OR REPLACE PROCEDURE error_test_prc () 
 LANGUAGE plpgsql
AS $body$
DECLARE
    var1 int;
BEGIN
    SELECT 10/0 INTO var1;
EXCEPTION 
    WHEN OTHERS THEN 
        declare                             --<<<<<<
           msg text                         --<<<<<<
        begin                               --<<<<<<
            msg = sqlerrm;                  --<<<<<<
            rollback;                       --<<<<<<
            CALL mdm_raw.error_logging_prc('this is a different proc test');   
            RAISE EXCEPTION 'Caught in Block 1 %',msg;
        end ;
END;
$body$


CREATE OR REPLACE PROCEDURE error_logging_prc msg_text text) 
 LANGUAGE plpgsql
AS $body$
DECLARE
    var1 int;
BEGIN
    INSERT INTO mdm_raw.raw_err_msg(msg_date, msg) VALUES(current_date, msg_text);
    commit;              --<<<<<< 
EXCEPTION 
    WHEN OTHERS THEN 
        RAISE EXCEPTION 'Error Caught in error_logging_prc %', SQLERRM;
END;
$body$ 

推荐阅读