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

时间:2016-01-15 19:56:53

标签: postgresql function loops plpgsql topology

我正在使用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_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都相等。

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

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

我认为应该这样做:

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), $2, 1, 1)'
          ' WHERE gid = $1'
        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$