0

以下のような関数を作成しました。

CREATE TYPE points AS (
    "gid" double precision
  , "elevation" double precision
  , "distance" double precision
  , "x" double precision
  , "y" double precision
);    

CREATE OR REPLACE FUNCTION public.nd_test4()
RETURNS  SETOF points AS $$

DECLARE     
    sql text;
    rec points;             
BEGIN       
    sql := 'select
        "gid"
        , "elev" as "elevation"
        , st_distance(ST_MakePoint(1093147, 1905632) , "the_geom" ) as "distance"
        , st_x("the_geom") as "x"
        , st_y("the_geom")as "y"
    from
        "elevation-test"
    where
        st_within("the_geom" ,st_buffer(ST_MakePoint(1093147, 1905632), 15) )
    order by distance limit 4';

    FOR rec IN EXECUTE(sql) LOOP
        RETURN NEXT rec;

    END LOOP;                                   
END;
    $$ LANGUAGE plpgsql VOLATILE;

のような関数を実行すると、select nd_test4();以下のようなファイル名のない結果が得られます。

画像?

次のようなファイル名で結果を取得するにはどうすればよいですか:

gid | elevation | distance | x       | y
----+-----------+----------+---------+-------
 1  | 350.0     | 10       | 12345.1 | 12435 
4

1 に答える 1

1

次のように関数を呼び出します。

SELECT * FROM nd_test4();

また、関数定義は不必要に複雑です。次のように単純化します。

CREATE OR REPLACE FUNCTION public.nd_test4()
  RETURNS SETOF points AS
$func$
BEGIN

RETURN QUERY
SELECT gid
      ,elev           -- AS elevation
      ,st_distance(ST_MakePoint(1093147, 1905632) , the_geom ) -- AS distance
      ,st_x(the_geom) -- AS x
      ,st_y(the_geom) -- AS y
FROM   "elevation-test"
WHERE  st_within(the_geom, st_buffer(ST_MakePoint(1093147, 1905632), 15))
ORDER  BY distance
LIMIT  4;

END
$func$ LANGUAGE plpgsql;

または、ここで単純な SQL 関数を使用することをお勧めします。

CREATE OR REPLACE FUNCTION public.nd_test4()
  RETURNS SETOF points AS
$func$
SELECT gid
      ,elev           -- AS elevation
      ,st_distance(ST_MakePoint(1093147, 1905632) , the_geom ) -- AS distance
      ,st_x(the_geom) -- AS x
      ,st_y(the_geom) -- AS y
FROM  "elevation-test"
WHERE  st_within(the_geom, st_buffer(ST_MakePoint(1093147, 1905632), 15))
ORDER  BY distance
LIMIT  4
$func$ LANGUAGE sql;
  • 動的 SQL は必要ありません。

  • 不必要な二重引用符も削除しました。正当な小文字の識別子には必要ありません。例外は"elevation-test". -テーブル名の一部として演算子 ( ) を使用しないでください。それはただトラブルを求めているだけです。

  • 関数本体のエイリアスは、複合型の列名に置き換えられます。それらは関数内でのみ表示されるため、ケースのドキュメントのみです。

于 2013-10-16T04:01:55.180 に答える