Précédent   Forum des professionnels en informatique > Bases de données > Oracle > PL/SQL
PL/SQL Forum d'entraide sur le PL/SQL
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 04/02/2012, 22h06   #1
Membre à l'essai
 
Inscription : avril 2007
Messages : 200
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 200
Points : 23
Points : 23
Par défaut Problème avec un trigger d'insertion

Salut à tous,

Je commence par vous décrire le problème:
Je travaille sur la table client suivante:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
 
CREATE TABLE client(
	client_id number,
	client_last_name varchar2,
	client_first_name varchar2(20),
	client_address varchar2(40),
	client_tel number,
	client_mail varchar2(30),
	client_ca number,
	client_category varchar2(20),
	constraint pk_client PRIMARY KEY(client_id)
);
où client_ca est le chiffre d'affaire du client.client_category est la catégorie du client qui varie selon le chiffre d'affaire.
Je voulais créer un trigger qui met à jour le champs client_category à chaque insertion d'un nouveau client(qui se fait à l'aide d'une procédure).

Voici mon code

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
30
31
32
 
/*Procédure d'ajout d'un client*/
CREATE OR REPLACE procedure add_client(client_id number,client_last_name varchar2,client_first_name varchar2,client_address varchar2,client_tel number,client_mail varchar2,client_ca number,client_category varchar2) IS
begin
INSERT INTO client VALUES(client_id,client_last_name,client_first_name,client_address,client_tel,client_mail,client_ca,client_category);
commit;
end;
 
/*Procédure de maj de la catégorie*/
CREATE OR REPLACE procedure maj_client_category(arg_client_id number) IS
	v_client_category client.client_category%type;
begin
	SELECT client_category INTO v_client_category FROM client WHERE client_id=arg_client_id;
	IF (v_client_category < 5000) then
	UPDATE client SET client_category='passager';
	elsif (v_client_category > 10000) then
	UPDATE client SET client_category='potentiel';
	else
	UPDATE client SET client_category='important';
	end IF;
end;
/
 
/*Trigger qui appelle la procédure précédente à la suite de chaque insertion d'un client*/
CREATE OR REPLACE TRIGGER tr_after_add_client
after INSERT 
ON client
FOR each row
begin
	maj_client_category(:new.client_id);
end;
/
lorsque je tente d'exécuter la procédure d'insertion, je me trouve avec l'erreur suivante:

Code :
1
2
 
ORA-00900: instruction SQL non valide
Comment faire????
adrian07 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/02/2012, 16h35   #2
Membre à l'essai
 
Inscription : avril 2007
Messages : 200
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 200
Points : 23
Points : 23
Lorsque je tente de faire appel à la première procédure via invite de commande, je me trouve avec le message suivant

Code :
1
2
3
4
5
6
7
8
9
 
ERREUR à la ligne 1 :
ORA-04091: la TABLE SYSTEM.CLIENT est en mutation ; le déclencheur ou la
fonction ne peut la voir
ORA-06512: Ó "SYSTEM.MAJ_CLIENT_CATEGORY", ligne 4
ORA-06512: Ó "SYSTEM.TR_AFTER_ADD_CLIENT", ligne 2
ORA-04088: erreur lors d'exÚcution du dÚclencheur 'SYSTEM.TR_AFTER_ADD_CLIENT'
ORA-06512: Ó "SYSTEM.ADD_CLIENT", ligne 3
ORA-06512: Ó ligne 1
Aucune idée ????
adrian07 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/02/2012, 10h06   #3
Membre Expert
 
Avatar de Garuda
 
Homme Philippe CHIRCOP
Chef de projet
Inscription : juin 2007
Messages : 1 109
Détails du profil
Informations personnelles :
Nom : Homme Philippe CHIRCOP
Localisation : France

Informations professionnelles :
Activité : Chef de projet
Secteur : Bâtiment

Informations forums :
Inscription : juin 2007
Messages : 1 109
Points : 1 559
Points : 1 559
Une table ne peux pas s'auto modifier dans un trigger !
De plus ton update met à jour toute la table !
Ce que tu dois faire est hyper simple !
Utilise :NEW pour modifier les colonnes de l'enregistrement courant !
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
/*TRIGGER de maj de la catégorie*/
CREATE OR REPLACE TRIGGER maj_client_category 
BEFORE INSERT ON CLIENT
FOR EACH ROW IS
begin
 IF :new.client_category < 5000) then
 :new.client_category:='passager';
    elsif (:new.client_category > 10000) then
 :new.client_category:='potentiel';
    else
:new.client_category:='important';
    end IF;
end;
C'est bizarre quand même tu testes sur une zone NUMERIQUE et tu mets la même zone à jour par une valeur ALPHA : tout ca se mord un peu la queue !
__________________
Garuda गरूड
Brahmâ la Guerre et Vishnu la Paix

Oracle 10.2.0.4 - Forms6i patch 17 - Toad 11.1 - sharePoint 2010
Garuda est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 07/02/2012, 00h33   #4
Membre à l'essai
 
Inscription : avril 2007
Messages : 200
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 200
Points : 23
Points : 23
Merci infiniment pour ta réponse, tu me sauves la vie ...

En fait je me suis trompé, le champs de test est client_ca et le champ à mettre à jour est client_category...

Donc je rectifie :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
 
/*TRIGGER de maj de la catégorie*/
CREATE OR REPLACE TRIGGER maj_client_category 
BEFORE INSERT ON CLIENT
FOR EACH ROW
begin
 IF (:new.client_ca < 5000) then
 :new.client_category:='passager';
    elsif (:new.client_ca > 10000) then
 :new.client_category:='potentiel';
    else
:new.client_category:='important';
    end IF;
end;
/
adrian07 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 17h58.


 
 
 
 
Partenaires

Hébergement Web