2013-11-11 2 views
3

Я предпочитаю писать свои функции PostgreSQL таким образом, что у меня всегда есть обработчик исключений по умолчанию, который добавляет имя функции к исключенному броску и повторно бросает его снова.Могу ли я параметризовать SQLSTATE в исключениях в PostgreSQL

Пример:

BEGIN 
    RAISE exception SQLSTATE '77777' using message = 'Test exception'; 
EXCEPTION 
    WHEN others THEN 
     raise exception 
     using message = 'error_handling_test: ' || sqlstate 
     || '/' || sqlerrm; 
END; 

В этом случае SQLSTATE 77777 не распространяется дальше и исключение я ловлю позднее по умолчанию SQLSTATE P0001.

Можно добавить SQLSTATE также в сборщик обработчиков исключений, но это, по-видимому, ограничено жестко запрограммированной строкой. То, что я хотел бы получить, это примерно так:

Это не скомпилируется.

+1

Всегда предоставляйте полное определение функции, включая * заголовок. Даже если это тривиально, это облегчает тестирование. И ваша версия Postgres, конечно. –

+1

, если вы можете использовать 9.3, то вы можете использовать дополнительные поля исключений http://www.postgresql.org/docs/9.3/static/plpgsql-control-structures.html#PLPGSQL-ERROR-TRAPPING, чтобы вы не необходимо обработать поле сообщений. –

+0

@PavelStehule - это бесполезно для моего использования, так как мне нужно sqlstate вне Postgres, на Java. – Raqua

ответ

5

Это будет выглядеть так:

CREATE OR REPLACE FUNCTION f_err() 
RETURNS void AS 
$func$ 
BEGIN 
    RAISE exception SQLSTATE '77777' using message = 'Test exception'; 
EXCEPTION 
    WHEN others THEN 
     RAISE EXCEPTION 
     USING ERRCODE = sqlstate 
      ,MESSAGE = 'error_handling_test: ' || sqlstate || '/' || sqlerrm; 

END 
$func$ LANGUAGE plpgsql; 

Значение SQLSTATE в RAISE EXCEPTION SQLSTATE '12345' не может быть переменной, но должен быть буквальным. The manual не очень понятно.

Вместо этого укажите код ошибки в предложении USING.

Примечание для случайного считывателя: special variablessqlstate и sqlerrm видны только в обработчике EXCEPTION.

+0

Спасибо, это то, что я искал, работает, как и ожидалось. – Raqua

Смежные вопросы