[pgsql-jp: 26587] Re: PL/pgSQLで関数を作成したい

羽生 章洋 habu @ air-beat.com
2002年 7月 5日 (金) 16:19:16 JST


羽生です。

> UPされていたコードを元に作ってみました。適当に修正して
> 使ってください。

[pgsql-jp: 26510] Re: 空きID の複数検索
で杉田さんが書かれていたSQL関数をラップしてみました。
一時テーブルを使わないので、こちらのほうがより
便利だと思います。

# こちらのほうが明らかにスマートですね(^^)

■まずSQL関数をそのまま使わせていただきます。
 (杉田さん、ありがとうございます)

-- 7.2 用のダミー、7.3 では不用。
CREATE OR REPLACE FUNCTION g(int4, int4) RETURNS SETOF integer AS '
SELECT 0;
' LANGUAGE sql;

CREATE OR REPLACE FUNCTION g(int4, int4) RETURNS SETOF integer AS '
SELECT g($1 - 1, $2) WHERE $1 > $2 UNION SELECT $1;
' language sql;

■呼び出す関数を作るためにPL/pgSQLでラップします。

create or replace function GetEmptyID2(int4,int4)
returns REFCURSOR as '
declare
    ret REFCURSOR;
begin
    OPEN ret FOR
    SELECT * FROM (SELECT g(e, b)
              FROM (SELECT min(id) AS b, max(id) AS e FROM a) AS s)
              AS g
          EXCEPT SELECT id FROM a
    ;
    RETURN ret;
end;
' LANGUAGE 'PLpgSQL'
;

■実行確認

iruka=# begin;
BEGIN
iruka=# select GetEmptyID2(1,10);
    getemptyid2
--------------------
 <unnamed cursor 1>
(1 row)

iruka=# fetch all in "<unnamed cursor 1>";
 g
---
 2
 3
 6
 7
 9
(5 rows)

iruka=# end;

以上です。

先ほどはちゃんと過去ログ読まずに妙なサンプルを上げちゃいまして
申し訳ございませんでした > 皆様


================================================================
★ワクワク音楽体験サイト それが【エア・ビート・ドットコム】!★
================================================================
有限会社エア・ビート(http://www.air-beat.com/)
取締役兼CEO 羽生 章洋(mailto:habu @ air-beat.com)
================================================================



pgsql-jp メーリングリストの案内