0

我是 postgres 的新手,并试图设置一个返回一点的函数。

我不断收到错误

函数的最终语句必须是 SELECT 或 INSERT/UPDATE/DELETE RETURNING。

我明白那个

除非函数声明为返回 void,否则最后一条语句必须是 SELECT,或者具有 RETURNING 子句的 INSERT、UPDATE 或 DELETE。

这是代码

CREATE OR REPLACE FUNCTION "f"(...)
  RETURNS bit AS
 DO $$
 Begin
        IF  someStuff
        THEN 
           0; //also tried select 0 //also tried return 0
        ELSE
           1;  //also tried select 1 //also tried return 0
        END IF;
        0; //also tried select 0 //also tried return 0
END $$

我的语法哪里出错了?

4

2 回答 2

2

有几个错误:

  • DO函数定义中的错误
  • 您缺少语言规范
  • 在 PL/pgSQL 你return用来返回函数的结果

所以你的功能变成:

CREATE OR REPLACE FUNCTION f(some_value integer)
  RETURNS bit AS
 $$
 Begin
    IF (some_value = 1)
    THEN 
       return 0; 
    ELSE
       return 1; 
    END IF;
END $$
language plpgsql

但是您应该使用boolean而不是位来返回真/假标志:

CREATE OR REPLACE FUNCTION f(some_value integer)
  RETURNS boolean AS
 $$
 Begin
    IF (some_value = 1)
    THEN 
       return false; 
    ELSE
       return true; 
    END IF;
END $$
language plpgsql
于 2013-03-27T15:34:57.180 回答
1

如果您想使用 plpgsql,请按照 a_horse 的答案执行,但如果您不需要 plpgsql,请在 sql 中执行:

create or replace function f(some_value integer)
returns boolean as $$

    select some_value = 1;

$$
language sql;

如果该功能是此问题中的功能,那么它将执行此操作:

create or replace function isPersonQualifiedForJob(pid integer, jid)
returns boolean as $$

    select exists (
        select 1
        from
            getskillsforjob(jid) j
            inner join
            getskillsforperson(pid) p on j.skillid = p.skillid
    )

$$
language sql;

检查exists比计数要快得多,因为它足以找到第一个匹配项。

于 2013-03-27T15:40:44.627 回答