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

PL/SQL Oracle Discussion :

Problème avec un trigger d'insertion


Sujet :

PL/SQL Oracle

  1. #1
    Membre éclairé
    Inscrit en
    Avril 2007
    Messages
    227
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 227
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : 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
     
    /*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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ORA-00900: instruction SQL non valide
    Comment faire????

  2. #2
    Membre éclairé
    Inscrit en
    Avril 2007
    Messages
    227
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 227
    Par défaut
    Lorsque je tente de faire appel à la première procédure via invite de commande, je me trouve avec le message suivant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 ????

  3. #3
    Membre Expert Avatar de Garuda
    Homme Profil pro
    Chef de projet / Urbaniste SI
    Inscrit en
    Juin 2007
    Messages
    1 285
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 285
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 !

  4. #4
    Membre éclairé
    Inscrit en
    Avril 2007
    Messages
    227
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 227
    Par défaut
    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 : 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
     
     
    /*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;
    /

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. probléme avec un trigger
    Par sofiane1111 dans le forum Oracle
    Réponses: 4
    Dernier message: 14/06/2007, 11h17
  2. [VB.NET/Access] Problème avec une requête d'insertion
    Par Bladinou dans le forum Accès aux données
    Réponses: 8
    Dernier message: 29/05/2007, 18h06
  3. Réponses: 4
    Dernier message: 08/01/2007, 13h06
  4. Problème avec un trigger...
    Par nasgektw dans le forum Développement
    Réponses: 3
    Dernier message: 28/04/2006, 17h41
  5. [T-SQL] problème avec un trigger
    Par karine77 dans le forum Adaptive Server Enterprise
    Réponses: 3
    Dernier message: 26/09/2005, 10h45

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