创建创建新序列的过程/函数

时间:2019-10-27 14:53:49

标签: postgresql plpgsql

我需要在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 个答案:

答案 0 :(得分:2)

您需要像使用@a_horse_with_no_name一样使用dynamic SQL,但是您需要使用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;

答案 1 :(得分:0)

为此,您需要dynamic 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,则也可以使用过程代替函数。