我需要将错误代码 (SQLSTATE
) 和 INSERT 或 UPDATE 返回的错误消息 (SQLERRM
) 保存在一个表中。我的过程必须执行一个 INSERT,如果发生错误,它必须保存到一个适当的表中。
但问题是,如果我使用 EXCEPTION
block ,当发生错误时,事务将中止并且之后的任何命令都无法执行。
如何使用 PLPGSQL 将查询返回的错误保存到表中?
最佳答案
有两种可能的解决方案:
使用 CSV 格式的 PostgreSQL 日志。稍后您可以通过\copy 语句将 pg 日志导入到表中。如果可能,首选这种方式,因为它对性能的负面影响最小。
您可以通过更多技术模拟自主交易
- PostgreSQL 数据库链接
- PostgreSQL FDW 驱动程序
dblink 的示例基于仿真(Jon Roberts 和我):
CREATE OR REPLACE FUNCTION fn_log_error(_function varchar,
_location int, _error varchar)
RETURNS void AS $$
DECLARE
_sql varchar;
_exec_error varchar;
BEGIN
PERFORM dblink_connect('autonom_connection', 'dbname=...');
_sql := format('INSERT INTO error_log (function_name, location,
error_message, error_time) VALUES (%L, %s, %L, %L)',
_function, _location, _error, clock_timestamp());
PERFORM dblink_exec('autonom_connection', _sql, false);
_exec_error := dblink_error_message('autonom_connection');
IF position('ERROR' in _exec_error) > 0
OR position('WARNING' in _exec_error) > 0 THEN
RAISE EXCEPTION '%', _exec_error;
END IF;
PERFORM dblink_disconnect('autonom_connection');
EXCEPTION
WHEN others THEN
PERFORM dblink_disconnect('autonom_connection');
RAISE EXCEPTION '(%)', SQLERRM;
END;
$$ LANGUAGE plpgsql;
其他一些例子:
关于postgresql - 如何将plpgsql中的查询错误保存到表中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28190731/