Bonjour,

J'aimerais passer un nom de table comme paramètre vers une fonction à partir d'un trigger

trigger:

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;
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
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;
Apparemment ça ne fonctionne pas : est-il possible de passer ce nom de table de cette manière???

J'avais initialement pensé faire directement la correction dans le trigger

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
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

Merci