【发布时间】:2014-12-02 21:21:54
【问题描述】:
我正在尝试在 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';
仍然希望得到一个答案来解释为什么后者有效而前者(即使按照@a_horse_with_no_name 的建议将语言更改为plpgsql)不能,或提供一些有用的教程。
【问题讨论】:
-
你的函数定义为
language sql。 sql中没有return语句,只有PL/pgSQL中 -
@a_horse_with_no_name 我将
language sql更改为langauge plpgsql,同样的错误。 -
与
language sql一起使用:sqlfiddle.com/#!15/7cf4a/1 和plpgsql:sqlfiddle.com/#!15/90f62/1 顺便说一句:语言名称是一个标识符,所以请不要使用单引号plpgsql或sql,但不是@987654336 @ -
@a_horse_with_no_name 抱歉,我在做其他愚蠢的事情。谢谢。
标签: sql postgresql stored-procedures plpgsql