1

一連のレコードを返す PostgreSQL 再帰関数を作成していますが、正しい構文がわかりません。ここでの再帰テーブルは、以下の列を含む垂直です。

CREATE TABLE vertical
(
  id serial NOT NULL,
  name character varying(100) NOT NULL,
  insert_timestamp timestamp without time zone NOT NULL DEFAULT now(),
  deleted smallint NOT NULL DEFAULT 0,
  parent_id integer, // refer to another Vertical
  locations character varying(200),
  level smallint NOT NULL DEFAULT 1,
  CONSTRAINT vertical_pkey PRIMARY KEY (id ),
  CONSTRAINT vertical_parent_fkey FOREIGN KEY (parent_id)
      REFERENCES vertical (id) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION,
  CONSTRAINT name_ukey UNIQUE (name )
)

これが私のSQLステートメントです(指定されたIDでVerticalのすべての子を取得します):

CREATE FUNCTION getAllVerticalChilds(verticalId integer) RETURNS SETOF RECORD AS 
$BODY$
BEGIN
   WITH RECURSIVE childs(id, name, parent_id, level) AS (
   SELECT child.id, child.name, child.parent_id, child.level
   FROM vertical child
   WHERE child.parent_id = verticalId
   UNION ALL
   SELECT parent.id, parent.name, parent.parent_id, parent.level
   FROM childs child
   INNER JOIN vertical parent ON parent.parent_id = child.id where parent.deleted=0
   )
   SELECT id, name, parent_id, level
   FROM childs;
END
$BODY$
LANGUAGE plpgsql VOLATILE;

これを修正するのを手伝ってもらえますか? どうもありがとう!

4

1 に答える 1

5

postgresqlでは、関数からいくつかをプッシュできる場合は、ステートメントRETURNを使用する必要があります。あなたの場合、おそらくRETURNQUERY..。

BEGIN
  RETURN QUERY WITH RECURSIVE ...
END

また、関数をTABLE関数として宣言すると、関数の使用法がはるかにユーザーフレンドリーになります。

CREATE OR REPLACE FUNCTION xx(..) RETURNS TABLE(a int, b int, ...)

この関数の使用法は次のとおりです(PostgreSQLにはステートメントCALLがありません)

SELECT * FROM xx(..)
于 2013-03-01T10:23:00.790 に答える