Précédent   Forum des professionnels en informatique > Bases de données > PostgreSQL
PostgreSQL Forum PostgreSQL. Avant de poster -> F.A.Q PostGreSQL Tutoriels PostGreSQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 26/07/2004, 20h54   #1
Invité de passage
 
Inscription : avril 2004
Messages : 1
Détails du profil
Informations forums :
Inscription : avril 2004
Messages : 1
Points : 0
Points : 0
Par défaut TRIGGER FUNCTION

Bonjour,

je possède une table client dont la primary key est ref_client.
Le format de la clef primaire est CLIXXXX. Mon souci est d'incrémenter automatiquement à chaque insertion dans la table client, la clé primaire CLIXXXX. J'ai eu idée (en lisant le cours SQL de A à Z) de créer une table supplémentaire répertoriant la dernière valeur numérique de la clé primaire de ma table client.

Je souhaite faire un trigger déclenché avant l'insertion dans la table client. Ce trigger récupère cette dernière valeur numérique, l'incrémente, la concatène avec la chaîne CLI et l'insère dans CLIENT.

Mais j'ai quelques problèmes avec les triggers et les fonctions sous postgresql.
Il me réclame un type trigger. J'ai vu qu'il fallait mettre OPAQUE. Mais ensuite seul language 'plpgsql' semble être autorisé. Or moi il me dit language inconnu, j'ai pourtant installé le rpm correspondant.

Merci de m'aider.
Nico
nisambou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/07/2004, 23h52   #2
Membre du Club
 
Inscription : mars 2004
Messages : 89
Détails du profil
Informations forums :
Inscription : mars 2004
Messages : 89
Points : 59
Points : 59
Bonjour,

Tout d'abord il faut initialiser le PL/pgSQL de la maniere suivante:

createlang plpgsql votredb

ensuite créez votre trigger qui va déclencher votre fonction:

exemple:

Code :
1
2
3
CREATE TRIGGER concat BEFORE INSERT
	ON TABLE FOR EACH ROW
EXECUTE PROCEDURE concat();
ensuite voici un exemple de concaténation:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
CREATE FUNCTION concat() RETURNS opaque AS '
 
	BEGIN
 
 
		UPDATE ONLY table
		SET champ1 =  table.champ2 || articles_tbl.champ3
 
		FROM ...
 
		WHERE  ...;;
 
		RETURN NEW;
	END;
 
  'LANGUAGE 'plpgsql';
et la un exemple d'incrémentation:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
CREATE FUNCTION numero() RETURNS opaque AS '
 
	BEGIN
	UPDATE table
		SET numero=table.champs+1
 
		FROM .....
 
		WHERE .....;
 
		RETURN NEW;
	END;
 
  'LANGUAGE 'plpgsql';
Vous allez peut être rencontrer un probleme de position de curseur en fonction de ce que vous souaitez concaténer, je l'ai finalement résolu de la maniere suivante:

http://www.developpez.net/forums/viewtopic.php?t=192538
$grm$ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/07/2004, 14h43   #3
Nouveau Membre du Club
 
Inscription : mai 2004
Messages : 41
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : mai 2004
Messages : 41
Points : 25
Points : 25
tu devrais utiliser pour ta colonne clé un type de données adéquat comme serial ou bigserial qui sont autoincrémentés à chaque nouvelle ligne.
hatake.kakashi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/07/2004, 20h04   #4
Membre régulier
 
Inscription : juillet 2004
Messages : 276
Détails du profil
Informations forums :
Inscription : juillet 2004
Messages : 276
Points : 73
Points : 73
Salut,

merci pour vos réponses. J'ai réussi à mettre en place ce que je voulais. Par contre pour le type serial je n'ai pas essayé. Ca marche avec un suffixe en caractère ?
etiennegaloup est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/07/2004, 21h39   #5
Membre du Club
 
Inscription : mars 2004
Messages : 89
Détails du profil
Informations forums :
Inscription : mars 2004
Messages : 89
Points : 59
Points : 59
De nada, n'oublie pas le tag résolu

@peluche
$grm$ est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 18h33.


 
 
 
 
Partenaires

Hébergement Web