Bonjour,
J'aimerais passer un nom de table comme paramètre vers une fonction à partir d'un trigger
trigger:
la fonction appelée
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 CREATE OR REPLACE FUNCTION trig_corrige_geo() RETURNS trigger AS $BODY$ DECLARE texte varchar:=null; BEGIN texte='SELECT ISVALID(g) as test_geo FROM public.'||TG_TABLE_NAME||' where ISVALID(g)=''f'' ORDER BY test_geo LIMIT 1;'; EXECUTE texte; IF FOUND THEN --appelle la fonction qui corrige les géométries texte:= 'select corrige_geo('''||TG_TABLE_NAME||''');'; EXECUTE texte; END IF; --found RETURN NEW; END; $BODY$ LANGUAGE 'plpgsql' VOLATILE COST 100; ALTER FUNCTION trig_corrige_geo() OWNER TO postgres;
Apparemment ça ne fonctionne pas : est-il possible de passer ce nom de table de cette manière???
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 CREATE OR REPLACE FUNCTION corrige_geo(t character varying) RETURNS character varying AS $BODY$ DECLARE texte varchar:=null; r1 RECORD; var_integer integer; BEGIN SELECT into r1 * FROM "information_schema"."columns" WHERE table_name=t and column_name='g'; IF found THEN texte:= 'SELECT ISVALID(g) AS test_geo FROM public.'||t||' where (geometrytype(g)=''MULTIPOLYGON'' OR geometrytype(g)=''POLYGON'') and ISVALID(g)=''f'' ORDER BY test_geo LIMIT 1;'; EXECUTE texte; IF found THEN texte:= 'UPDATE public.'||t||' SET g=multi(buffer(g,0)) where geometrytype(g)=''MULTIPOLYGON'' OR geometrytype(g)=''POLYGON'' and ISVALID(g)=''f'';'; EXECUTE texte; END IF; END IF;--found RETURN 'fin du traitement'; END; $BODY$ LANGUAGE 'plpgsql' VOLATILE COST 100; ALTER FUNCTION corrige_geo(character varying) OWNER TO postgres;
J'avais initialement pensé faire directement la correction dans le trigger
mais j'ai un message d'erreur: ERREUR: ne peut pas exécuter ... car cet objet est en cours d'utilisation par des requêtes actives dans cette session
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 texte:= 'SELECT ISVALID(g) AS test_geo FROM public.'||TG_TABLE_NAME||' where ISVALID(g)=''f'' ORDER BY test_geo LIMIT 1;'; EXECUTE vsql into r1; IF found THEN texte:= 'UPDATE public.'||TG_TABLE_NAME||' SET g=multi(buffer(g,0)) where (geometrytype(g)=''MULTIPOLYGON'' OR geometrytype(g)=''POLYGON'') and ISVALID(g)=''f'';'; EXECUTE texte; END IF; --found
Merci
Partager