Переменные PL / pgSQL работают только для команд SELECT
и DML.Эти операторы имеют план выполнения, который может быть выполнен с параметрами.Среда выполнения PLpgSQL может использовать переменные plpgsql в качестве параметров.Команды статического SQL без плана, такие как DDL, SET
, SHOW
, .. не могут использовать переменные plpgsql.Не существует единственного способа, как это сделать, и существует риск двусмысленной семантики.В этом случае вам следует использовать динамический SQL.
DO $$
BEGIN
EXECUTE format('SET choice.p = %L', 'some text);
RAISE NOTICE '%', current_setting('choice.p');
END;
$$;
Основная причина, по которой ваш пример не работает, проста - команда SQL SET
не поддерживает выражения, а затем нетправильный способ, как применять там переменные plpgsql.