Postgresql Postgres-如何调用存储的plpgsql函数,函数本身是否出错?
我已经使用plpgsql编写了一个Postgres函数,但是当我使用以下命令调用它时,得到了一个“语法错误,意外字符”: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
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编写的吗?