Пользовательские исключения PostgreSQL? - PullRequest
2 голосов
/ 23 апреля 2010

В Firebird мы можем объявить пользовательские исключения следующим образом:

CREATE EXCEPTION EXP_CUSTOM_0 'Исключение: пользовательское исключение';

они хранятся на уровне базы данных.В хранимых процедурах мы можем вызвать исключение следующим образом:

EXCEPTION EXP_CUSTOM_0;

Есть ли эквивалент в PostgreSQL?

1 Ответ

8 голосов
/ 23 апреля 2010

Нет, не так. Но вы можете создавать и поддерживать свои собственные исключения, без проблем:

CREATE TABLE exceptions(
    id serial primary key,
    MESSAGE text, 
    DETAIL text, 
    HINT text, 
    ERRCODE text
);

INSERT INTO exceptions (message, detail, hint, errcode) VALUES ('wrong', 'really wrong!', 'fix this problem', 'P0000');

CREATE OR REPLACE FUNCTION foo() RETURNS int LANGUAGE plpgsql AS
$$
DECLARE
    row record;
BEGIN
    PERFORM * FROM fox; -- does not exist, undefined_table, fail

    EXCEPTION
        WHEN undefined_table THEN
            SELECT * INTO row FROM exceptions WHERE id = 1; -- get your exception
            RAISE EXCEPTION USING MESSAGE = row.message, DETAIL = row.detail, HINT = row.hint, ERRCODE = row.errcode;

    RETURN 1;
END;
$$

SELECT foo();

Конечно, вы также можете использовать их жестко в своих процедурах, это ваше дело.

...