Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.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
从SQL函数返回布尔值_Sql_Postgresql_Stored Procedures_Plpgsql - Fatal编程技术网

从SQL函数返回布尔值

从SQL函数返回布尔值,sql,postgresql,stored-procedures,plpgsql,Sql,Postgresql,Stored Procedures,Plpgsql,我试图在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); $

我试图在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所建议的那样),或者提供一些有用的教程。

SQL 使用
选择
。普通SQL中没有
RETURN

PL/pgSQL PL/pgSQL需要
BEGIN
END


不要在
语法中使用过时(此处是多余的)
别名。您可以直接引用参数名(从第9.2页开始,在SQL函数中也是如此)。

您的函数定义为
语言SQL
。sql中没有
return
语句,只有PL语句/pgSQL@a_horse_with_no_name我将
language sql
更改为
langauge plpgsql
,同样的错误。使用
language sql
:和
plpgsql
:顺便说一句:语言名称是一个标识符,所以请不要用单引号
plpgsql
sql
,但不要用
'plpgsql'
@a_horse__nou_name抱歉,我在做别的蠢事。谢谢。您是否有理由将参数称为
$1
$2
,而不是函数体中的
role
from_role
。OP没有透露他的版本,所以位置参考是安全的选择。在我的答案的末尾有一个暗示。更多:
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;
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;