【问题标题】:Get individual columns from function returning SETOF <composite type> [duplicate]从返回 SETOF <composite type> 的函数中获取单个列 [重复]
【发布时间】:2013-10-16 03:30:53
【问题描述】:

我创建了如下函数:

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(); 这样的函数时,我得到的结果没有像下面这样的文件名。

image?

我怎样才能得到这样的文件名的结果:

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

【问题讨论】:

  • 你的问题是什么?

标签: sql postgresql plpgsql composite-types


【解决方案1】:

调用函数:

SELECT <b>* FROM</b> 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"。您不应该使用运算符 (-) 作为表名的一部分。那只是自找麻烦。

  • 函数体中的别名被复合类型的列名替换。它们仅在函数内部可见,因此在您的案例中只是文档。

【讨论】:

  • 问题解决了!!我错过了非常简单的事情。谢谢你 erwin,也感谢你提供更多建议。
猜你喜欢
  • 1970-01-01
  • 2013-07-25
  • 1970-01-01
  • 2015-03-24
  • 2019-11-13
  • 1970-01-01
  • 2021-12-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多