Проверить значение с помощью current_setting()

Я пытаюсь работать с current_setting().

Я придумал это:

CREATE OR REPLACE FUNCTION process_audit() RETURNS TRIGGER AS $audit$
    DECLARE
        user_id integer;
    BEGIN
        BEGIN
            user_id := current_setting('hws.current_user_id');
        EXCEPTION WHEN OTHERS THEN
            user_id := NULL;
        END;
        ...
        RETURN NULL;
   END;
$audit$ LANGUAGE plpgsql;

Настройка устанавливается с помощью:

SELECT set_config('hws.current_user_id', '5', true); -- true = local setting -> only visible in current transaction

Проблема заключается в том, что current_setting() генерирует исключение, если значение недопустимо. Я не хочу использовать EXCEPTION, потому что я читаю, что блоки исключений дороги.

Есть ли способ проверить, имеет ли значение значение без использования исключений?

Btw: Я также пытался читать из pg_settings, но, похоже, не работает с локальными настройками.

Ответы

Ответ 1

9.6 и новее:

PostgreSQL (9.6+) поддерживает current_setting('setting_name', 't') для получения настроек и возврата NULL, если он не установлен. вы можете объединить это с coalesce, чтобы указать значение по умолчанию.

9,5 и старше:

В этом вопросе вы можете сделать это с помощью функции plpgsql, которая использует обработчик BEGIN ... EXCEPTION, если вы не против удара производительности и неуклюжести. Но нет встроенной поддержки.

Ответ 2

Разве вы не должны сделать бросок? Следующее,

user_id := current_setting('hws.current_user_id')::integer;