Passage paramètre trigger vers fonction
Bonjour,
J'aimerais passer un nom de table comme paramètre vers une fonction à partir d'un trigger
trigger:
Code:
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:
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 :cry:: 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:
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