POSTGRES / POSTGIS为后续循环动态定义一个RETURN表(列类型,名称)

时间:2018-09-19 11:23:22

标签: postgresql postgis plpgsql

我要实现的是对来自表的记录数执行st_Intersection(clipper_geom,clipped_geom)。

https://postgis.net/docs/ST_Intersection.html

https://postgis.net/docs/ST_Intersects.html

POSTGIS交集与st_intersects()不同,POSTGIS交集本身不支持处理多个几何,因此我必须设计一个函数(返回表),该函数选择与st_intersects相交的所有要素与我的裁剪器区域,并循环遍历此结果在每条记录上查询并执行交集st_intersection,“ geom”字段和“ clipped_geom_wkt”是实际记录裁剪后的几何图形的对象。

该函数有效,但是我要生成剪裁的每个表都需要一个不同的函数。我想实现的是动态读取输入表(列名和类型)并在RETURN语句中进行定义。

所有字段的名称和类型都相同,唯一要更新的字段是geom,要添加的新字段是clipped_geom_wkt。

我尝试搜索Stack Overflow,并找到了有关如何创建动态表结构的示例,但没有发现任何内容,然后对第一个结果执行了后续LOOP,其中列名称必须匹配才能插入/更新新数据。

到目前为止,这是我要提出的内容,但是我对如何执行LOOP部分,添加clipped_geom_wkt字段和更新geom字段很有用。在这里的一些回复中,我认为建议将RETURN类型设置为TABLE。 如果将更多字段添加到SETOF

Easy way to have return type be SETOF table plus additional fields?

但是同时,我还看到只有在表定义返回为SETOF时才支持动态生成的列

Refactor a PL/pgSQL function to return the output of various SELECT queries

PostgreSQL: ERROR: 42601: a column definition list is required for functions returning "record"

CREATE OR REPLACE FUNCTION clip_palin_polygon_complete(clipped_table text,clipper_geom text, age_sequence VARCHAR)
RETURNS TABLE (rec clipped_table, clipped_geom_wkt text)) AS $$ --not sure if this is the right way to do it...
DECLARE var_r record;
BEGIN
    FOR var_r IN (
        SELECT * FROM clipped_table 
        WHERE clipped_table.seq IN (age_sequence)
        AND ST_Intersects(ST_GeomFromText(clipper_geom,4326), clipped_table.geom)
    )
    LOOP
        /* 
        these are the original table fields that I would like to keep and match
        dynamically with any table I have as input (clipped_table)
        objectid := var_r.objectid;
        seq := var_r.seq;
        age := var_r.age;
        primary_lithology := var_r.primary_lithology;
        confidence := var_r.confidence;
        area_calculated := var_r.area_calculated;*/

        --below there are the only two fields that need modifying
        geom := (
            SELECT ST_Intersection(ST_GeomFromText(clipper_geom, 4326), var_r.geom) AS geom);
        clipped_geom_wkt := (
            SELECT
            ST_AsText(ST_Intersection(ST_GeomFromText(clipper_geom,4326), var_r.geom)) AS clipped_geom_wkt);
        RETURN NEXT;
    END LOOP;
END; $$
LANGUAGE 'plpgsql'

0 个答案:

没有答案