【问题标题】:How to save query errors in plpgsql to a table?如何将plpgsql中的查询错误保存到表中?
【发布时间】:2015-03-27 06:18:56
【问题描述】:

我需要将 INSERT 或 UPDATE 返回的错误代码 (SQLSTATE) 和错误消息 (SQLERRM) 保存在表格中。我的程序必须执行 INSERT,如果发生错误,必须将其保存到适当的表中。

但问题是,如果我使用EXCEPTION 块,当发生错误时,事务将被中止,之后的任何命令都无法执行。

如何使用 PLPGSQL 将查询返回的错误保存在表中?

【问题讨论】:

    标签: postgresql logging error-handling transactions plpgsql


    【解决方案1】:

    有两种可能的解决方案:

    1. 使用 CSV 格式的 PostgreSQL 日志。稍后您可以通过 \copy 语句将 pg 日志导入表。如果可能,这种方式是首选,因为它对性能的负面影响最小。

    2. 您可以通过更多技术模拟自主交易

      • 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;
    

    其他一些例子:

    【讨论】:

      猜你喜欢
      • 2013-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-06
      相关资源
      最近更新 更多