Установить PgSQL runtime-paramter из параметра функции? - PullRequest
0 голосов
/ 29 января 2019

Я создал функцию pl / pgsql с параметром varchar.В этой функции я попытался установить для параметра времени выполнения значение параметра функции.

CREATE FUNCTION test_function (param VARCHAR)
RETURNS VOID AS $tf$
BEGIN
SET choice.p = param;
RAISE NOTICE '%', current_setting('choice.p');
END; $tf$ LANGUAGE plpgsql;

Однако напечатанное значение равно «param».Параметр обрабатывается как строка вместо имени параметра.Почему это так, и как я могу добиться того, что я пытаюсь сделать?

1 Ответ

0 голосов
/ 30 января 2019

Переменные 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.

...