IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes PostgreSQL Discussion :

Passage paramètre trigger vers fonction


Sujet :

Requêtes PostgreSQL

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3
    Points : 1
    Points
    1
    Par défaut 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 : 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

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    Par défaut
    Dans le principe, il est possible de passer le nom de table et de lancer des requêtes dynamiques avec EXECUTE. Mais le problème n'est-il pas que tu essaies de faire un UPDATE d'une table dans un trigger sur UPDATE de cette même table, ce qui logiquement devrait re-déclencher le trigger et ce à l'infini? Normalement c'est détecté par le SGBD et ça doit logiquement provoquer une erreur.

    Pour mettre à jour un champ dans un trigger sur la table modifiée, il faut écrire quelque chose du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    NEW.champ = valeur;
    et non pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE table SET champ=valeur

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    C'est certainement un peu trop compliqué mais ça marche comme ça : en vérifiant la valeur de la sélection et non pas seulement s'il y en a un résultat...
    (j'ai bien conscience que c'est tarabiscoté et qu'il doit y avoir beaucoup plus simple en corrigeant avec le trigger même et sans faire appel à une fonction mais pour un début... )


    Je vais chercher aussi cette solution.

    Merci.

    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
     
    -- Function: risque.corrige_geo(character varying)
     
    -- DROP FUNCTION risque.corrige_geo(character varying);
     
    CREATE OR REPLACE FUNCTION risque.corrige_geo(t character varying)
      RETURNS character varying AS
    $BODY$
     
    DECLARE
    texte varchar:=null;
    verif2 varchar:=null;
    r1 RECORD;
    r2 RECORD;
     
    var_integer integer;
    BEGIN
     
    SELECT into r1 * FROM "information_schema"."columns" WHERE table_name=t and column_name='geo_obj1';
     
    IF found THEN
    RAISE NOTICE 'a trouvé et test si geo fausses';
    texte:= 'SELECT ISVALID(geo_obj1) AS test_geo FROM risque.'||t||' where (geometrytype(geo_obj1)=''MULTIPOLYGON'' OR geometrytype(geo_obj1)=''POLYGON'') and ISVALID(geo_obj1)=''f'' ORDER BY test_geo LIMIT 1;';
    EXECUTE texte into r2;
    verif2=r2.test_geo;
    RAISE NOTICE 'verif vrai/faux2 %', verif2;
     
      -- IF found THEN
     
      IF verif2='f' THEN
         RAISE NOTICE 'test1 fait la correction';
         texte:= 'UPDATE risque.'||t||' SET geo_obj1=multi(buffer(geo_obj1,0)) where geometrytype(geo_obj1)=''MULTIPOLYGON'' OR geometrytype(geo_obj1)=''POLYGON'' and ISVALID(geo_obj1)=''f'';';
         EXECUTE texte ;
         ELSE
         RAISE NOTICE 'test2 ne fait pas la correction';
       END IF;
     
     
       ELSE
            RAISE NOTICE 'pas trouvé de geo fausses';
    END IF;--found
     
    RETURN 'fin du traitement';
    END;
     
    $BODY$
      LANGUAGE 'plpgsql' VOLATILE
      COST 100;
    ALTER FUNCTION risque.corrige_geo(character varying) OWNER TO postgres;

  4. #4
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    voili voilou en moins tarabiscoté...

    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 risque.trig_corrige_geo2()
      RETURNS trigger AS
    $BODY$
     
    DECLARE
    texte varchar:=null;
    verif  varchar:=null;
    r1 record;
     
    BEGIN
    texte='SELECT ISVALID(geo_obj1) as test_geo_trig FROM risque.'||TG_TABLE_NAME||' ORDER BY test_geo_trig LIMIT 1;';
    EXECUTE texte into r1;
     
    verif=r1.test_geo_trig;
     
     
    IF verif='f' THEN 
     
     texte:= 'UPDATE risque.'||TG_TABLE_NAME||' SET geo_obj1=multi(buffer(geo_obj1,0)) where geometrytype(geo_obj1)=''MULTIPOLYGON'' OR geometrytype(geo_obj1)=''POLYGON'' and ISVALID(geo_obj1)=''f'';';
    EXECUTE texte;
     
    END IF; --found
     
    RETURN NEW;
    END;
    $BODY$
      LANGUAGE 'plpgsql' VOLATILE
      COST 100;
    ALTER FUNCTION risque.trig_corrige_geo2() OWNER TO postgres;

Discussions similaires

  1. Passage tableau PHP vers fonction javascript - contrôle de choix
    Par carkiko dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 29/04/2015, 12h08
  2. [CoffeeScript] Passage paramètre dans une fonction onclick
    Par hannibal.76 dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 21/11/2014, 22h15
  3. incohérence passage paramètre d'une fonction
    Par EIN-LESER dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 27/04/2012, 09h29
  4. Passage de graphique vers fonction
    Par thechakib dans le forum MATLAB
    Réponses: 1
    Dernier message: 09/05/2007, 16h05
  5. Passage paramètres Php vers Vbs
    Par Travailleuuse06 dans le forum VBScript
    Réponses: 1
    Dernier message: 04/09/2006, 20h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo