postgresql - 其他异常时登录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$
解决方案
您可以通过回滚当前事务来完成此操作,然后插入并提交您的日志。请参阅以下过程中标有 --<<<<< 的行。另一个是设置一个 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$
推荐阅读
- python - 如何在熊猫中一次重新分配多个 MultiIndex 列?
- python - 使用熊猫,在将每个连续值与前一个值进行比较时,遍历数据框中的列的最佳方法是什么
- list - 使用回归量列表并存储 beta 值
- java - 无法使用 Spring Boot 将 Node 保存到 Neo4j
- mongodb - Springboot mongo异常与Docker
- javascript - jquery 函数总是跳过表单验证
- tableau-api - Tableau 数据层仅转换为一种状态
- php - PDO MYSQL_ATTR_USE_BUFFERED_QUERY 不生效
- flutter - 尝试将我的颤振应用程序运行到我的设备时出现此错误报告
- javascript - 不使用 Express 节点服务器显示反应组件