将查询结果存储在函数内

时间:2017-08-08 15:47:51

标签: sql postgresql function postgis

我有以下功能:

DO
$do$
DECLARE
maxgid      integer;
tableloop   integer;
obstacle    geometry;
simplifyedobstacle  geometry;
BEGIN

    select max(gid) from public.terrain_obstacle_temp into maxgid;

    FOR tableloop IN 1 .. maxgid
    LOOP
        insert into public.terrain_obstacle (tse_coll,tse_height,geom) select tse_coll,tse_height,geom
        from public.terrain_obstacle_temp where gid = tableloop;

    END LOOP;

END
$do$;

我需要修改此函数,以便根据public.terrain_obstacle_temp列的类型执行不同的查询。

这是一个通过读取shapefile创建的临时表,我需要知道该表的geom列的类型。我有一个查询将数据提供给我:

SELECT type 
FROM geometry_columns 
WHERE f_table_schema = 'public' 
AND f_table_name = 'terrain_obstacle' 
and f_geometry_column = 'geom';

它返回character_varying值(在本例中为MULTIPOLYGON)。

我可以修改函数以获取查询结果,并创建一个if语句,允许我根据该查询的结果执行一些代码吗?

1 个答案:

答案 0 :(得分:1)

是否打算将临时表中的所有记录复制到实际表中?如果是这样,您可以跳过循环:

insert into public.terrain_obstacle (tse_coll, tse_height, geom)
  select tse_coll, tse_height, geom
    from public.terrain_obstacle_temp
;

terrain_obstacleterrain_obstacle_temp具有相同的结构吗?如果是,那么"插入...选择..."如果列类型相同,应该可以正常工作。

如果需要条件输入,请使用CASE WHEN语法:

v_type  geometry_columns.type%TYPE;

...

SELECT type
  INTO v_type 
  FROM geometry_columns 
  WHERE f_table_schema = 'public' 
    AND f_table_name = 'terrain_obstacle' 
    AND f_geometry_column = 'geom'
;

insert into public.terrain_obstacle (tse_coll, tse_height, geom)
  select tse_coll
        ,tse_height
        ,CASE WHEN v_type = 'MULTIPOLYGON' THEN my_func1(geom)
              WHEN v_type = 'POINT' THEN my_func2(geom)
              ELSE my_default(geom)
         END
    from public.terrain_obstacle_temp
;