Создать процедуру / функцию, которая создает новую последовательность - PullRequest
0 голосов
/ 27 октября 2019

Мне нужно создать новую процедуру / функцию в Postgres, которая создает новую последовательность. Процедура / функция получит имя последовательности в виде переменной и создаст ее. Я пытался следовать документации, но это не очень полезно. Это то, что у меня так далеко, но оно не работает (конечно):

CREATE FUNCTION create_seq(text) RETURNS text  
    AS 'CREATE SEQUENCE $1 START 100;'
    LANGUAGE SQL
    IMMUTABLE
    RETURNS NULL ON NULL INPUT;
ERROR:  return type mismatch in a function declared to return text
DETAIL:  Function's final statement must be SELECT or INSERT/UPDATE/DELETE RETURNING.
CONTEXT:  SQL function "create_seq"```

Ответы [ 2 ]

2 голосов
/ 28 октября 2019

вам нужно использовать динамический SQL , как сказано @a_horse_with_no_name, но вам нужно использовать язык plpgsql, а не язык sql для функции, для запоминания return void , пример:

CREATE FUNCTION create_seq_plpgsql(p_seq_name text) 
 RETURNS void
AS
$$
begin
 execute format('CREATE SEQUENCE %I START 100', p_seq_name);
end;
$$
LANGUAGE plpgsql;
0 голосов
/ 27 октября 2019

Для этого вам нужно динамический SQL , параметры не могут использоваться в качестве идентификаторов.

Чтобы правильно обращаться с именами, которые потенциально могут заключаться в кавычки, настоятельно рекомендуется использовать format() функция для генерации SQL.

И вам нужно объявить функцию как returns void, так как вы не хотите ничего возвращать.

CREATE FUNCTION create_seq(p_seq_name, text) 
  RETURNS void
AS
$$
begin
 execute format('CREATE SEQUENCE %I START 100', p_seq_name);
end;
$$
LANGUAGE plpgsql;

Есливы используете Postgres 11, вы также можете использовать для этого процедуру вместо функции.

...