2013-03-27 124 views
0

我是新來的postgres並試圖設置一個返回一點的函數。我如何在postgres中返回一點

我不斷收到錯誤

函數的最後語句必須是SELECT或INSERT/UPDATE/DELETE 回來。

我明白

Unless the function is declared to return void, the last statement must be a SELECT, or an INSERT, UPDATE, or DELETE that has a RETURNING clause.

這裏是代碼

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 $$ 

我在哪裏的語法問題呢?

+0

檢查我的更新答案。 – 2013-03-27 15:58:42

回答

2

存在幾個誤區:

  • DO是錯誤的函數定義
  • 你缺少你用return返回函數的結果在PL/pgSQL的語言
  • 的規範

所以你的功能變成:

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 
1

如果你想PLPGSQL使用然後做作爲a_horse的答案,但如果你並不需要在SQL PLPGSQL做:

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

    select some_value = 1; 

$$ 
language sql; 

如果函數是從this question的一個,那麼這將做到這一點:

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比計算快得多,因爲它足以找到第一個匹配。

+0

更好,但我認爲混淆的'someStuff'「要求」會變得更加複雜。 – 2013-03-27 15:43:31

+0

@a_horse我想我找到了_someStuff_,如果是這樣的話,sql版本仍然足夠。查看更新。 – 2013-03-27 15:57:39