Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 如何将plpgsql中的查询错误保存到表中?_Postgresql_Logging_Error Handling_Transactions_Plpgsql - Fatal编程技术网

Postgresql 如何将plpgsql中的查询错误保存到表中?

Postgresql 如何将plpgsql中的查询错误保存到表中?,postgresql,logging,error-handling,transactions,plpgsql,Postgresql,Logging,Error Handling,Transactions,Plpgsql,我需要将插入或更新返回的错误代码(SQLSTATE)和错误消息(SQLERRM)保存在表中。我的过程必须执行INSERT,如果发生错误,必须将其保存到相应的表中 但问题是,如果我使用异常块,当出现错误时,事务将中止,之后的任何命令都无法执行 如何使用PLPGSQL将查询返回的错误保存在表中?有两种可能的解决方案: 使用PostgreSQL日志的CSV格式。稍后,您可以通过\copy语句将pg日志导入到表中。如果可能的话,最好使用这种方法,因为它对性能的负面影响最小 您可以通过更多技术模拟自治事务

我需要将插入或更新返回的错误代码(
SQLSTATE
)和错误消息(
SQLERRM
)保存在表中。我的过程必须执行INSERT,如果发生错误,必须将其保存到相应的表中

但问题是,如果我使用
异常
块,当出现错误时,事务将中止,之后的任何命令都无法执行


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

有两种可能的解决方案:

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

  • 您可以通过更多技术模拟自治事务

    • PostgreSQL数据库链接
    • PostgreSQL FDW驱动程序
  • 基于仿真的示例(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;