我已经写了一个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$