[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 メーリングリストの案内