問題のあるコード:
CREATE OR REPLACE FUNCTION foo(searchid INTEGER)
RETURNS INTEGER AS
$$
DECLARE
level INTEGER := 0;
mid INTEGER := searchid;
BEGIN
WHILE EXISTS(SELECT id INTO mid FROM tbl1 WHERE parent_id=mid) LOOP
level := level + 1;
END LOOP;
RETURN level;
END;
$$
LANGUAGE 'plpgsql' IMMUTABLE;
id を持つ要素のツリーの深さを見つける必要があります。searchid
上記とは少し異なる関数を作成しましたmid NOTNULL
。これは while ループの条件として使用され、機能します。
ただし、上記のコードのようにEXISTS
WHILE 条件で直接使用しようとすると、postgresql は次のように言います。
SQL error:
ERROR: syntax error at or near "$1"
LINE 1: SELECT EXISTS(SELECT id INTO $1 FROM tbl1 WHERE ...
そのため、私のコードで奇妙な変換が行われ、構文的に間違っています。
修正方法は?
postgresql 8.3.17 で動作します。