1

私はPostgreSQLの関数を始めたばかりで、これはおそらくかなり基本的なことですが、これはどのように行われますか?

関数で次のものを使用できるようにしたいと思います。

PERFORM id_exists();
IF FOUND THEN
   -- Do something
END IF;

ここで、id_exists()関数(SELECTおよびPERFORMで使用される)は次のとおりです。

CREATE OR REPLACE FUNCTION id_exists() RETURNS int AS $$
DECLARE
  my_id int;
BEGIN
  SELECT id INTO my_id
  FROM tablename LIMIT 1;
  RETURN my_id;
END;
$$ LANGUAGE plpgsql;

現在、my_idテーブルに存在しない場合でもFOUND、おそらく行がまだ返されている(null整数)ためにtrueですか?これを書き直して、見つかった場合に整数が返されるようにするにはどうすればよいですか。そうでない場合は、何も返されません。

4

1 に答える 1

1

あなたの仮定は正しく、値に関係なく、最後のステートメントが行を返した場合にFOUND設定されます(あなたの場合もあります)。詳細はこちらのマニュアルをご覧ください。TRUENULL

たとえば、次のように書き直します。

IF id_exists() IS NOT NULL THEN
   -- Do something
END IF;

または、関数の戻り値をで書き直して、SETOF複数の行を返すことができるようにします。または、行を返さないようにします。私が示すように使用してくださいRETURN QUERY。この機能は、元の設定で使用できます。

CREATE OR REPLACE FUNCTION id_exists()
  RETURNS SETOF int LANGUAGE plpgsql AS
$BODY$
BEGIN
  RETURN QUERY
  SELECT id
  FROM   tablename
  LIMIT  1;
END;
$BODY$;

または言語SQL関数を使用するとさらに簡単になります。

CREATE OR REPLACE FUNCTION id_exists()
  RETURNS SETOF int LANGUAGE sql AS
$BODY$
  SELECT id
  FROM   tablename
  LIMIT  1;
$BODY$;
于 2012-06-20T19:43:48.100 に答える