Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
#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)
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
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