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

Kazusi Nakamura kazz @ emsg.jp
2002年 7月 3日 (水) 18:34:31 JST


中村と申します。いつもお世話になりっぱなしです。
RedHat Linux 7.x  PostgreSQL7.1.3 にて勉強中の身であります。
以前質問した「空きIDの複数検索」の延長になるのですが、どうぞよろしく
お願いいたします。また、長文をお許しください。

以下のようなテーブル構造で
create table a(
    id integer,
    name text
);

データが
 id         nm
-----------------
  1         aaa
  4         bbb
  5         ccc
  8         ddd
 10         eee
と、あったときに、1〜10のID中から空いている5個のID(2,3,6,7,9)を
一度に取得できるSQLを書きたいのですが…

という質問をInterBaseに強い同僚に投げかけたところ「ストアドプロシージャ」
なるものを使い関数を以下の通り作成すれば可能だ! と回答されました。
InterBaseのそれをそのまま掲載させていただきます。

set names eucj_0208;
connect "/users/kazz/a.gdb";

SET TERM ^ ;
create PROCEDURE GetEmptyID
(
        i_fromID            integer
       ,i_toID              integer
)
Returns
(
       EmptyID             integer
)
as
    declare variable    m_ID integer ;
BEGIN
    EmptyID = i_fromID;
    for
        select id from a
        where  ID between :i_fromID and  :i_toID
        into  :m_ID
    Do
    begin
       if (EmptyID = m_ID) then
       Begin
         EmptyID = EmptyID +1;
       END
       ELSE
       BEGIN
         if (EmptyID<m_ID) then
         BEGIN
           While (EmptyID<m_ID) DO
           BEGIN
             Suspend;
             EmptyID = EmptyID +1;
           END
           EmptyID = EmptyID +1;
         END
       END
    END
END ^

SET TERM ; ^

commit;

として、関数を作成し、InterBaseにて
select GetEmptyID(1,10);
で実行させたところ望み通りの結果が返ってきました。

InterBaseに可能でPostgreSQLで不可能は無いと思い、書籍をあさったところ
PG/pgSQL言語なるものを発見し、さっそくインストールを完了させ、同様に

create function GetEmptyID(int, int) returns integer as '
    declare
        i_fromID alias for $1;
        i_toID alias for $2;
        EmptyID int;
        m_ID int;
    begin
        EmptyID := ifromID;
        FOR m_ID IN SELECT id FROM a
        WHERE id BETWEEN i_fromID AND i_toID LOOP
            IF(EmptyID = m_ID) THEN
                EmptyID := EmptyID + 1;
            ELSE
                WHILE (EmptyID < m_ID) LOOP
                    Suspend;
                    EmptyID := EmptyID + 1;
                END LOOP
                EmptyID := EmptyID + 1;
            END IF;
        END LOOP;
        end;
' LANGUAGE 'plpgsql';

とし、関数はCREATEできるのですが、いざ
select GetEmptyID(1,10);
で実行させると、
NOTICE:  plpgsql: ERROR during compile of getid near line 18
ERROR:  parse error at or near "EmptyID"
となり、先へ進めません。(おとといから丸二日以上苦労しております)

どなたかPL/pgSQL言語に詳しい方、ご教授ください。必ず同様な事は
PostgreSQLでも出来ると信じております。よろしくお願いいたします。



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