在 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$
我正在使用 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$