Я пытаюсь написать процедуру plpg sql для выполнения пространственного разбиения таблицы postGIS. Я могу успешно выполнить операцию, используя следующую процедуру, в которой имена таблиц жестко закодированы. Процедура циклически перебирает плитки в tile_table и для каждой плитки обрезает область area_table и вставляет ее в split_table.
CREATE OR REPLACE PROCEDURE splitbytile()
AS $$
DECLARE
tile RECORD;
BEGIN
FOR tile IN
SELECT tid, geom FROM test_tiles ORDER BY tid
LOOP
INSERT INTO split_table (id, areaname, ttid, geom)
SELECT id, areaname, tile.tid,
CASE WHEN st_within(base.geom, tile.geom) THEN st_multi(base.geom)
ELSE st_multi(st_intersection(base.geom, tile.geom)) END as geom
FROM area_table as base
WHERE st_intersects(base.geom, tile.geom);
COMMIT;
END LOOP;
END;
$$ LANGUAGE 'plpgsql';
После успешного тестирования мне нужно преобразовать ее в динамическую c процедуру, в которой я может предоставить имена таблиц в качестве параметров. Я попробовал следующее частичное преобразование, используя format () для внутренней части l oop:
CREATE OR REPLACE PROCEDURE splitbytile(in_table text, grid_table text, split_table text)
AS $$
DECLARE
tile RECORD;
BEGIN
FOR tile IN
EXECUTE format('SELECT tid, geom FROM %I ORDER BY tid', grid_table)
LOOP
EXECUTE
FORMAT(
'INSERT INTO %1$I (id, areaname, ttid, geom)
SELECT id, areaname, tile.tid,
CASE WHEN st_within(base.geom, tile.geom) THEN st_multi(base.geom)
ELSE st_multi(st_intersection(base.geom, tile.geom)) END as geom
FROM %2$I as base
WHERE st_intersects(base.geom, tile.geom)', split_table, in_table
);
COMMIT;
END LOOP;
END;
$$ LANGUAGE 'plpgsql';
Но выдает ошибку
missing FROM-clause entry for table "tile"
Итак, как я могу преобразовать процедуру Динамо c один? Более конкретно, как я могу использовать тип данных записи (мозаику), возвращаемый для l oop внутри l oop? Обратите внимание, что это работает, когда формат не используется.