我有一个名为 的线表,segment
存储在模式中,还有一个在模式中reference
命名的多边形表。我尝试创建一个触发器,在更新字段或插入新的. 两种情况:communes
donnees_externes
segment
communes
geom
segment
- 插入:新要素应在多边形的边界上分割
communes
,并且生成的每条线都应具有其所属多边形的一些属性 - 更新:现有要素应继续存在,其 id 不应更改,但应在多边形边界上有新的几何分割,并在必要时添加新属性。对于几何体相交的每个新多边形,新要素应插入到同一个表中
NEW
。
我下面的代码相应地更新了现有功能,但应该插入到表中的行却没有。我认为这与我处理函数返回的方式有关,但我尝试了很多组合但没有成功。
CREATE OR REPLACE FUNCTION split_segments_on_communes_and_update_collectivities_codes()
RETURNS TRIGGER AS
$BODY$
DECLARE
rec RECORD;
BEGIN
FOR rec IN
SELECT c.insee_com AS insee_com,
'0' || c.insee_dep AS insee_dep,
c.insee_reg AS insee_reg,
c.code_epci AS code_epci,
(ST_Dump(ST_Intersection(NEW.geom, c.geom))).geom AS geom,
(ST_Dump(ST_Intersection(NEW.geom, c.geom))).path[0] AS "path",
NEW.id_statut,
NEW.propriete,
NEW.author,
NEW.create_date
FROM donnees_externes.commune c
WHERE ST_Intersects(NEW.geom, c.geom)
LOOP
IF rec."path" = 1 OR rec."path" IS NULL THEN
NEW.geom = rec.geom;
NEW.code_reg = rec.insee_reg;
NEW.code_dep = rec.insee_dep;
NEW.code_epci = rec.code_epci;
NEW.code_commune = rec.insee_com;
ELSE
INSERT INTO reference.segment (geom,
id_statut,
propriete,
code_epci,
code_dep,
code_reg,
author,
create_date,
code_commune)
VALUES (
rec.geom,
NEW.id_statut,
NEW.propriete,
rec.code_epci,
rec.insee_dep,
rec.insee_reg,
NEW.author,
NEW.create_date,
rec.insee_com);
END IF;
END LOOP;
RETURN NEW;
END;
$BODY$
LANGUAGE plpgsql;
CREATE OR REPLACE TRIGGER split_segments_on_communes_and_update_collectivities_codes
BEFORE INSERT
OR UPDATE OF geom
ON reference.segment
FOR EACH ROW
WHEN (pg_trigger_depth() < 1)
EXECUTE PROCEDURE split_segments_on_communes_and_update_collectivities_codes();
问题出在
path
该行的定义中:(ST_Dump(ST_Intersection(NEW.geom, c.geom))).path[0] AS "path"
。这是正确的方法:
以及完整的功能: