我是 PostgreSQL 的新手,来自 SQL Server,我在创建函数和/或过程时遇到了麻烦。首先,我可以澄清一下,函数和过程之间的唯一区别确实是对事务的支持吗?
现在回到我的问题,我想要一个简单的 func/proc 来返回当前连接的用户。无论如何都不使用它,因此任何其他示例都可以使用,它仅用于学习语法,因为 pgsql 与 t-sql 不同。这是我从教程网站获取的代码:
CREATE OR REPLACE FUNCTION dev.get_user()
RETURNS VARCHAR AS $user$
DECLARE
$user$ VARCHAR;
BEGIN
SELECT current_user AS user;
RETURN user;
END;
$user$ LANGUAGE plpgsql;
我得到了这个,我不知道为什么:
ERROR: syntax error at or near "VARCHAR"
LINE 4: $user$ VARCHAR;
如果我删除第 4 行,它会成功创建它,但是当我运行它时,它会返回此错误:
ERROR: query has no destination for result data
HINT: If you want to discard the results of a SELECT, use PERFORM instead.
我在 pgsql 12.3 上,如果有什么不同的话。谢谢你。
不,最大的区别是函数旨在返回某些内容,而过程则不是。
在 PL/pgSQL 中,SELECT 语句的结果需要存储在某个地方(这就是错误消息告诉您的内容)。
变量不是用 a 定义的,
$
所以第二个$user$
以第一个开头的字符串结束,$user$
这就是你得到第一个错误的原因。所以正确的写法是:
SELECT 并不是真正需要的,如果您调用一个函数(即
current_user
),您可以直接分配一个变量:分配 using
:=
比 a 更快SELECT .. INTO
。请注意,整个函数可以简化为:
有关更多详细信息,请参阅PL/pgSQL 参考