PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 10/08/2011 10:44:58

Geo-x
Membre

Concaténation de champ automatique avec conditions

Bonjour à tous,

Voici l'idée générale de ma requête. Je souhaiterais pouvoir remplir automatiquement un champ par concaténation via un trigger.

Ce trigger appel une fonction qui met des conditions à cette mise à jour.

Voici l'idée :

CREATE OR REPLACE FUNCTION UPDATE()
  RETURNS "trigger" AS $nomfic$
 
    BEGIN
 
	IF code_insee IS NULL THEN
 
	NEW.nomfic:='';
 
	ELSIF nom IS NULL
 
	NEW.nomfic:='';
 
	ELSIF nom AND code_insee IS NOT NULL THEN
 
	NEW.nomfic:=NEW.code_insee||'-'||NEW.nom||'machin';
 
	END IF;
        RETURN NEW;
 
    END;
$nomfic$
  LANGUAGE 'plpgsql';
 
ALTER FUNCTION UPDATE()OWNER TO postgres;
 
CREATE TRIGGER UPDATE BEFORE INSERT OR UPDATE
ON MaTable FOR EACH ROW
EXECUTE PROCEDURE UPDATE();

En espérant que vous puissiez m'éclairer sur les conditions dans une fonction...

Merci d'avance.

Geo-x

Hors ligne

#2 10/08/2011 16:51:45

gleu
Administrateur

Re : Concaténation de champ automatique avec conditions

Soyez plus précis car je ne vois pas du tout quel problème vous avez. En dehors du "ELSIF nom AND code_insee IS NOT NULL THEN" qui devrait être un "ELSIF nom IS NOT NULL AND code_insee IS NOT NULL THEN" (et même par un ELSE dans ce cas précis) smile


Guillaume.

Hors ligne

#3 11/08/2011 13:38:21

Geo-x
Membre

Re : Concaténation de champ automatique avec conditions

Bonjour gleu,

En fait j'aurais aimé savoir si les conditions dans une fonction qui renvoi un trigger, s'écrit de manière général de la façon dont je l'ai écrite sur mon précédent post

Je pose cette question, sachant que le trigger ne fonctionne pas correctement (j'ai l'impression qu'avec ce trigger l'update tourne en boucle dans le vide et la base plante).

Dans le même style j'ai testé de créer un trigger avec le code suivant :

Avec deux bases, une base 'commune' qui contient un code associé à une commune et une base sur laquelle je fais ma requête.

Le but étant de mettre à jour automatiquement dans ma BDD ou je fais la requête le nom de la commune en fonction du code qu'il va chercher dans la table 'commune' (Je suis clair?), ma requête qui fonctionne donne ça :

CREATE OR REPLACE FUNCTION update_e()
  RETURNS "trigger" AS $BODY$
 
    BEGIN
 
	UPDATE e
	SET e.nom=foo.nom 
	FROM dblink('hostaddr=127.0.0.1 port=5400 dbname=bidule user=postgres password=machin', 'SELECT code, nom FROM commune') AS foo (code integer, nom varchar)
	WHERE e.code_insee=foo.code

 
    END;
$BODY$

LANGUAGE 'plpgsql';
 
ALTER FUNCTION update_e()OWNER TO postgres;
 
CREATE TRIGGER update_eBEFORE INSERT OR UPDATE
ON eFOR EACH ROW
EXECUTE PROCEDURE update_e();

Mais quand il s'agit de la faire fonctionner on dirait que ça tourne en boucle sans s'arrêter et ça plante...

Merci de m'éclairer un peu, pour savoir si je fais un truc mal ou si j'oublie quelque chose...

Bonne journée.

Xavier

Hors ligne

#4 11/08/2011 21:03:13

gleu
Administrateur

Re : Concaténation de champ automatique avec conditions

En fait j'aurais aimé savoir si les conditions dans une fonction qui renvoi un trigger, s'écrit de manière général de la façon dont je l'ai écrite sur mon précédent post

Oui, ça s'écrit comme ça.

Mais quand il s'agit de la faire fonctionner on dirait que ça tourne en boucle sans s'arrêter et ça plante...

C'est clair que ça tourne en boucle. Un UPDATE sur e lance le trigger qui exécute un UPDATE sur e qui lance le triggerr qui exécute un UPDATE sur e qui lance le triggerr qui exécute un UPDATE sur e qui lance le triggerr qui exécute un UPDATE sur e qui lance le trigger etc etc smile

La procédure devrait plutôt ressembler à ceci :

CREATE OR REPLACE FUNCTION update_e()
RETURNS "trigger" AS $BODY$
DECLARE
  v_nom text;
BEGIN

  SELECT INTO v_nom foo.nom
  FROM dblink('hostaddr=127.0.0.1 port=5400 dbname=bidule user=postgres password=machin', 'SELECT code, nom FROM commune') AS foo (code integer, nom varchar)
    WHERE foo.code=NEW.code_insee;

  NEW.nom := v_nom;

  RETURN NEW;
END;
$BODY$

LANGUAGE 'plpgsql';

J'espère que vous n'aurez pas trop d'update sur cette table car faire un appel à dblink pour chaque update, c'est s'assurer d'avoir des performances très mauvaises.


Guillaume.

Hors ligne

#5 12/08/2011 12:06:15

Geo-x
Membre

Re : Concaténation de champ automatique avec conditions

En effet l'update qui tourne en boucle, ça me parait beaucoup plus clair maintenant, et ça me parait tellement évident. Ca veut donc dire qu'on ne peut pas faire d'update à partir d'un trigger, si j'ai bien compris...

Par rapport au code, je ne savait pas qu'en intégrant un SELECT INTO dans un trigger, il ne crée pas en 'dur' la table dans la BDD.

J'ai réussi à adapter la requête que vous m'avez donné et je vous remercie vivement pour l'aide que vous m'avez apporté.

Bonne continuation et peut être à bientôt. ;-)

Hors ligne

#6 12/08/2011 21:53:32

gleu
Administrateur

Re : Concaténation de champ automatique avec conditions

Vous pouvez faire un UPDATE dans le code d'un trigger, mais pas sur la même table que le trigger d'UPDATE. Pareil pour un INSERT, vous ne devez pas faire un INSERT dans le code du trigger d'INSERT pour la même table.


Guillaume.

Hors ligne

Pied de page des forums