我已经使用plpgsql编写了一个Postgres函数,但是得到了一个语法错误,意外的字符'当我用它来调用它时:
PERFORM create_user('a', 'b', 'c');
这是从pgAdmin:
复制的Postgres函数定义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语法错误的情况下调用该函数。
答案 0 :(得分:1)
大概是你在pgAdmin的SQL编辑器中输入这个:
PERFORM create_user('a', 'b', 'c');
由于PERFORM
不是常规SQL指令,因此语法错误失败。查看文档中SQL commands的参考列表,您会发现它不属于它们。
PERFORM
仅属于pl / pgsql语言,因此,只能在pl / pgsql函数中使用。它的documented为:
有时评估表达式或SELECT查询很有用 丢弃结果,例如在调用具有的函数时 副作用但没有有用的结果值。要在PL / pgSQL中执行 , 使用PERFORM语句:
PERFORM query;
执行查询并丢弃结果
要从pgAdmin或其他客户端应用程序调用函数,只需使用SELECT
,无论函数的语言是什么,无论它返回什么类型。
答案 1 :(得分:-1)
为什么不尝试下面的功能;通过声明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$