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/pgSQLreturnでは、関数の結果を返すために使用します

したがって、関数は次のようになります。

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ただし、true/false フラグを返すには、bit の代わりに使用する必要があります。

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 に答える