Message posté par : idjepacreutz
----------------------------------------
Le problème était dans l'utilisation de `path` dans cette ligne :
`(ST_Dump(ST_Intersection(NEW.geom, c.geom))).path[0] AS "path"`.
Voilà la bonne manière de faire :
``` SQL
WITH parts AS (
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,
NEW.id_statut,
NEW.propriete,
NEW.author,
NEW.create_date
FROM donnees_externes.commune c
WHERE ST_Intersects(NEW.geom, c.geom)
)
SELECT *,
ROW_NUMBER() OVER () AS "path"
FROM parts
```
Et la fonction complète :
``` SQL
CREATE OR REPLACE FUNCTION
reference.split_segments_on_communes_and_update_collectivities_codes()
RETURNS trigger
LANGUAGE plpgsql
AS $function$
DECLARE
rec RECORD;
newgeom geometry;
BEGIN
FOR rec IN
WITH parts AS (
SELECT c.insee_com AS insee_com,
'0' || c.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
FROM donnees_externes.commune c
WHERE ST_Intersects(NEW.geom, c.geom)
)
SELECT *,
ROW_NUMBER() OVER () AS "path"
FROM parts
LOOP
IF ST_GeometryType(rec.geom) != 'ST_Point' THEN
IF rec."path" = 1 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 IF;
END LOOP;
RETURN NEW;
END;
$function$
;
```
----------------------------------------
Le message est situé
https://georezo.net/forum/viewtopic.php?pid=364582#p364582
Pour y répondre : geobd(a)ml.georezo.net ou reply de votre messagerie
Pour vous désabonner connectez-vous sur le forum puis Profil / Abonnement
--
Association GeoRezo - le portail géomatique
https://georezo.net