我正在使用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个表中创建函数或其他循环结构来复制此过程,同时保存每个表的日志? 我试图创建一个函数,但在这种情况下,参数将是表名和拓扑名,我很难详细说明这个结构。
有什么建议吗?
答案 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$