在 Postgresql 中使用 table 和拓扑名称作为参数的函数或循环

Function or loop using table and topologies names as arguments in Postgresql

我正在使用 PostGIS 中的拓扑并创建 TopoGeometry 列,我正在使用此循环:

DO $$DECLARE r record;
BEGIN
 FOR r IN SELECT * FROM table_uf_11 LOOP
  BEGIN
    UPDATE table_uf_11 SET tg_geom = toTopoGeom(ST_Force2D(geom),'topology_uf_11', 1, 1) 
    WHERE gid= r.gid;
   EXCEPTION
    WHEN OTHERS THEN
     RAISE WARNING 'Loading of record % failed: %', r.gid, SQLERRM;
  END;
 END LOOP;
END$$;

之所以使用这个循环是因为toTopoGeom函数在某些行显示错误,但这只是少数情况,例如24.000中的38个。 使用此结构,我可以确定日志中哪些情况有问题并稍后修复它们。

我的问题是我还有另外 26 个 table 具有各自的拓扑结构,它们都由州代码标识,例如:

table_uf_12 / topology_uf_12
table_uf_13 / topology_uf_13
table_uf_14 / topology_uf_14
...
table_uf_53 / topology_uf_53

州代码不一定是连续的,但名称具有相同的模式。 geom 和 tg_geom 等列名称对于所有 table 都是相等的。

我如何制作一个函数或另一个循环结构来在所有 27 个 table 中复制这个过程,同时保存每个 table 的日志? 我试图创建一个函数,但在这种情况下,参数将是 table 名称和拓扑名称,我很难详细说明这个结构。

有什么建议吗?

我认为应该这样做:

DO $BODY$
DECLARE
  t regclass;
  gid bigint;
BEGIN
  FOR t IN SELECT oid::regclass FROM pg_class WHERE relname ~ '^table_uf_\d+$' LOOP
    FOR gid IN EXECUTE 'SELECT gid FROM ' || t::text LOOP
      BEGIN
        EXECUTE
          ' UPDATE ' || t::text ||
          ' SET tg_geom = toTopoGeom(ST_Force2D(geom), , 1, 1)'
          ' WHERE gid = '
        USING gid, replace(t::text, 'table', 'topology');
      EXCEPTION
        WHEN OTHERS THEN
          RAISE WARNING 'Loading of record % failed: %', gid, SQLERRM;
      END;
    END LOOP;
  END LOOP;
END
$BODY$