Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql Postgres-如何调用存储的plpgsql函数,函数本身是否出错?_Postgresql_Pgadmin - Fatal编程技术网

Postgresql Postgres-如何调用存储的plpgsql函数,函数本身是否出错?

Postgresql Postgres-如何调用存储的plpgsql函数,函数本身是否出错?,postgresql,pgadmin,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 varyin

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

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

在一些Postgres论坛帖子中,我发现并非所有版本都支持返回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$

您可能正在pgAdmin的SQL编辑器中键入以下内容:

PERFORM create_user('a', 'b', 'c');
此操作失败,并出现语法错误,因为PERFORM不是常规SQL指令。查看文档中的参考列表,您会发现它不是它们的一部分

PERFORM只属于pl/pgsql语言,因此只能从pl/pgsql函数内部使用。具体如下:

有时计算表达式或选择查询很有用,但 放弃结果,例如在调用具有 副作用,但没有有用的结果值。要在PL/pgSQL中执行此操作, 使用执行语句:

执行查询

这将执行查询并丢弃结果


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

我已通过以下方法使其正常工作:创建或替换函数CREATE\u userusername字符变化,password\u hash字符变化,电子邮件字符变量返回整数$BODY$插入用户用户名、密码哈希、电子邮件值$1、$2、$2返回id$BODY$语言sql VOLATILE COST 100;ALTER函数创建用户角色变化、角色变化、角色变化所有者到postgres;我想就像你的例子一样,它使用的是SQL语言,而不是plpgsql。据我所知,它实际上不是一个存储的plpgsql函数。@user1315172,很高兴知道你已经使用它了。关于你的评论,你是说我的回答对你没有帮助吗?你的评论很有帮助,但我没有运行它来查看它是否是问题的正确答案,它是否有效。我解决问题的方法不是使用我提出这个问题的方法,而是使用普通的SQL,而不是plpgsql。我还想知道您的示例是用plpgsql还是用标准ANSI编写的?SQL。从外观上看,它使用plpgsql,因为参数不是以$1、$2等形式编写的。在您的示例中编写“语言plpgsql”会改变它的功能吗?您的意思是您的示例是以plpgsql编写的吗?