Postgres -我如何调用存储的plpgsql函数,我在函数本身犯了一个错误



我已经写了一个Postgres函数,使用plpgsql,但得到一个'语法错误,意外字符'当我调用它使用:

PERFORM create_user('a', 'b', 'c');

下面是Postgres函数的定义,从pgAdmin:

CREATE OR REPLACE FUNCTION create_user(_username character varying, _passwordhash character varying, _email character varying)
RETURNS integer AS
$BODY$
BEGIN
INSERT INTO users(id, username, passwordhash, email) VALUES (DEFAULT, _username, _passwordhash, _email) RETURNING id;

END;$BODY$
LANGUAGE plpgsql VOLATILE SECURITY DEFINER
COST 100;
ALTER FUNCTION create_user(character varying, character varying, character varying)
OWNER TO postgres;
谁能指出我在这里做错了什么?

此外,我试图通过'pg'在node.js中访问它,但无论如何,我都无法在没有pgAdmin语法错误的情况下调用该函数。

假设你是在pgAdmin的SQL编辑器中输入这个:

PERFORM create_user('a', 'b', 'c');

因为PERFORM不是常规的SQL指令而导致语法错误。查看文档中的SQL命令参考列表,您会发现它不是其中的一部分。

PERFORM只属于pl/pgsql语言,因此只能在pl/pgsql函数中使用。文档如下:

有时对表达式或SELECT查询求值是有用的,但是丢弃结果,例如在调用具有的函数时副作用,但没有有用的结果价值。要在PL/pgSQL中执行,使用PERFORM语句:

执行查询;

执行查询并丢弃结果

要从pgAdmin或从另一个客户端应用程序调用函数,只需使用SELECT,无论该函数的语言是什么,也无论它返回的是什么类型。

为什么不试试下面的函数;声明一个INT变量,然后将生成的id序列捕获到该变量中。最后返回该变量

在一些Postgres论坛帖子中,我发现RETURNING id结构在所有版本中都不支持。因此,您可能希望以其他方式绕过它。

CREATE OR REPLACE FUNCTION create_user(_username character varying,
                                       _passwordhash character varying, 
                                       _email character varying)
RETURNS integer AS
$BODY$
DECLARE retvar integer; <-- declare the variable
BEGIN
  INSERT INTO users(id, username, passwordhash, email) 
  VALUES (DEFAULT, _username, _passwordhash, _email) RETURNING id into retvar;
                                                             <-- get return id
return retvar; <-- return the variable
END;
$BODY$

最新更新