POSTGRES / POSTGIS динамически определяют таблицу RETURN (тип столбца, имя) для последующего цикла - PullRequest
0 голосов
/ 19 сентября 2018

чего я хотел бы добиться, так это выполнить st_Intersection (clipper_geom, clipped_geom) для числа записей из таблицы.

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

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

POSTGIS Intersection не поддерживает исходную обработку нескольких геометрий, в отличие от st_intersects (), и мне пришлось разработать функцию (возвращающую таблицу), которая выбирает все объекты, пересекающиеся с st_intersects, в моей области отсечения, просматривая каждый результат этого запросаи выполнить пересечение st_intersection для каждой отдельной записи, поле "geom" и "clipped_geom_wkt" - это те, которые фактически записывают обрезанную геометрию.

Функция работает, но мне нужна другая для каждой таблицы, которую мы хотимпроизвести отсечение.Чего я хотел бы добиться, так это динамически читать входную таблицу (имя и тип столбца) и определять оба в операторе RETURN.

Все имена и типы полей одинаковы. Единственное, что будет обновлено, это geom, и будет добавлено новое, это clipped_geom_wkt.

Я попытался выполнить поиск переполнения стека и нашел примеры накак создать динамическую структуру таблицы, но ничего из того, что я нашел, затем выполнить последующую LOOP над первыми результатами, где имена столбцов должны совпадать, чтобы вставить / обновить новые данные.

Это то, что у меня естьПоднимитесь, но я уверен, как выполнить часть LOOP, добавить поле clipped_geom_wkt и обновить поле geom.В некоторых ответах здесь я вижу, что рекомендуется установить тип RETURN в TABLE, если в SETOF добавлено больше полей

Простой способ иметь тип возвращаемого значения - таблица SETOF плюс дополнительные поля?

Но в то же время я также вижу, что динамически генерируемые столбцы поддерживаются только в том случае, если определение таблицы возвращается как SETOF

Рефакторинг функции PL / pgSQL для возврата выходных данныхразличные запросы SELECT

PostgreSQL: ОШИБКА: 42601: список функций необходим для функций, возвращающих «запись»

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'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...