我需要在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"```
答案 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,则也可以使用过程代替函数。