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

时间:2014-07-25 19:29:27

标签: postgresql pgadmin

我已经使用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语法错误的情况下调用该函数。

2 个答案:

答案 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$