SQLSTATE и ПОЛУЧИТЬ ДИАГНОСТИЧЕСКУЮ информацию в другой функции? - PullRequest
1 голос
/ 06 июня 2019

В одной функции plpgsql у меня есть блок исключения, подобный этому:

exception when others then 
    txt := 'error text ';
    perform record_error(id, table, txt);

И когда возникает исключение, я хочу выполнить другую функцию, которая добавляет информацию об ошибке в таблицу журнала следующим образом:

CREATE OR REPLACE FUNCTION record_error(
    id integer,
    layer text,
    message text)
  RETURNS void AS
$BODY$

            DECLARE 
               l_code  integer:= 'sqlstate' 
               l_mesg  varchar:= 'SQLERRM'; 
               l_context text;
               l_detail text;
            BEGIN

                GET STACKED DIAGNOSTICS l_context = PG_EXCEPTION_CONTEXT;

                GET STACKED DIAGNOSTICS l_detail = PG_EXCEPTION_DETAIL;

               INSERT INTO error_log (            error_code ,
                                      error_message ,
                                      backtrace ,
                                      callstack ,
                                      created_on ,
                                      created_by ,
                                      user_msg ,
                                      etak_id ,
                                      layer )
                    VALUES (l_code ,
                            l_mesg ,
                            l_context, 
                            l_detail ,
                            current_timestamp  ,
                            CURRENT_USER ,
                            message ,
                            ETAK_ID ,
                            Layer );

            END;
            $BODY$
  LANGUAGE plpgsql VOLATILE

Но я получаю сообщение ОШИБКА: невозможно получить GET STACKED DIAGNOSTICS вне обработчика исключений.

Могу ли я использовать SQLSTATE и получить информацию STACKED DIAGNOSTICS в другой функции?

1 Ответ

1 голос
/ 06 июня 2019

Это невозможно. Причиной этого ограничения является реализация исключений и обработка исключений в функциях SQL. Поскольку нет смысла это делать, это запрещено синтаксисом.

...