我正在尝试在postgres中编写一个返回布尔表达式的PL / pgSQL函数。目前代码如下所示:
CREATE OR REPLACE FUNCTION is_visible_to(role integer, from_role integer)
RETURNS boolean
LANGUAGE SQL STABLE STRICT AS $$
RETURN $1 = $2 OR first_predicate($1, $2) OR second_predicate($2, $1);
$$;
函数first_predicate和second_predicate存在并返回布尔值,但是我没有太多帮助查看它们,因为它们的定义类似于
SELECT COUNT(*) > 0 FROM ... WHERE ...
我收到以下语法错误:
ERROR: syntax error at or near "RETURN"
LINE 4: RETURN $1 = $2 first_predicate($1, $2) OR second_predicate(...
^
显然,我在这里误解了一些相当重要的东西。我对整个PL / pgSQL事情都不熟悉,所以也可以赞赏一两个好教程的链接。
我正在开发的项目专门使用postgres,并且已经包含很多postgres特定的代码,因此解决方案不必移植到其他数据库。
修改 用
修正了它CREATE FUNCTION is_visible_to (role integer, from_role integer)
RETURNS BOOLEAN AS '
DECLARE
role ALIAS FOR $1;
from_role ALIAS FOR $2;
BEGIN
RETURN (role = from_role) OR
first_predicate(from_role, role) OR
second_predicate(from_role, role)
END;
' LANGUAGE 'plpgsql';
仍然会有一个答案可以解释为什么后来的作品和前者(即使语言改为plpgsql
,如@a_horse_with_no_name所建议的那样),或提供一些有用的教程。
答案 0 :(得分:5)
CREATE OR REPLACE FUNCTION is_visible_to(role integer, from_role integer)
RETURNS boolean AS
$func$
SELECT $1 = $2 OR first_predicate($1, $2) OR second_predicate($2, $1);
$func$ LANGUAGE sql STABLE STRICT;
SELECT
。普通SQL中没有RETURN
。 Details in the manual here.
CREATE OR REPLACE FUNCTION is_visible_to(role integer, from_role integer)
RETURNS boolean AS
$func$
BEGIN
RETURN $1 = $2 OR first_predicate($1, $2) OR second_predicate($2, $1);
END
$func$ LANGUAGE plpgsql STABLE STRICT;
PL / pgSQL需要 BEGIN
和END
。 Details in the manual here.
不要使用过时的(和冗余的)ALIAS FOR
语法。 It's discouraged in the manual.您可以直接引用参数名称(在SQL函数中也是如此,因为第9.2页)。