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

Oracle Discussion :

Erreurs lors d'exécution d'un trigger


Sujet :

Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Femme Profil pro
    Inscrit en
    Novembre 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 2
    Par défaut Erreurs lors d'exécution d'un trigger
    bonjour;
    le sujet: écrire une trigger de contrainte sur la table poste permettant de refuser l'ajout d'un nouveau poste si la salle(idsalle) n'est traversée par le segment (idsegment) et si le nombre de poste de la salle dépasse 14.
    les tables de ma base de donnée:
    table poste:

    IDPOSTE NOMPOSTE IDSEGMENT AD TYPEPOSTE IDSALLE NBLOG
    p1 Poste 1 130.120.80 01 TX s01 0
    p2 Poste 2 130.120.80 02 LINUX s01 2
    p3 Poste 3 130.120.80 03 TX s01 0
    table salle:
    IDSALLE NOMSALLE NBPOSTE IDSEGMENT
    s01 Salle 1 3 130.120.80
    s02 Salle 2 2 130.120.80
    s03 Salle 3 2 130.120.80
    s11 Salle 11 2 130.120.81
    s21 Salle 21 2 130.120.82

    voila le trigger que j'ai créer:
    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
    CREATE OR REPLACE Trig_Ins_Poste
    BEFORE INSERT ON Poste
    FOR EACH ROW
    DECLARE
    v_nbPos Salle.nbPoste%TYPE;
    v_idSeg Salle.idSegment%TYPE;
    BEGIN
    SELECT nbPoste, idSegment INTO v_nbPos, v_idSeg
    FROM Salle 
    WHERE idSalle = :NEW.idSalle;
     
    IF v_idSeg != :NEW.idSegment THEN
    DBMS_OUTPUT.PUT_LINE ('La Salle: '||:NEW.idSalle||' n''est pas traversée par le segment:'||:NEW.idSegment||'!');
    AND
    IF v_bPos > 14 THEN
    DBMS_OUTPUT.PUT_LINE ('La Salle: '||:NEW.idSalle||' a un nombre poste supérieur à 14');
    END IF;
    END IF;
    END;
    /
    SHOW ERRORS ;
    L;
    il m'as afficher:
    ERREUR à la ligne 1 :
    ORA-00922: option erronée ou absente
    SP2-0851: La commande commençant par "v_idSeg Sa..." n'est pas disponible dans iSQL*Plus
    SP2-0552: Variable de lien "NEW" non déclarée.
    merci.

  2. #2
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 954
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 954
    Par défaut
    Les IF ne sont pas bon.

    Par ailleurs dans un trigger on utilise raise_application_error pour renvoyer une erreur et empêcher l'insertion.
    La section de gestion des erreurs
    Vous pouvez également définir vos propres messages d'erreur avec la procédure RAISE_APPLICATION_ERROR

    DBMS_STANDARD.raise_application_error(numero_erreur, message[, {TRUE | FALSE}])

    numero_erreur représente un entier négatif compris entre -20000 et -20999
    message représente le texte du message d'une longueur maximum de 2048 octets
    TRUE indique que l'erreur est ajoutée à la pile des erreurs précedentes
    FALSE indique que l'erreur remplace toutes les erreurs précédentes

    Du fait que cette procédure appartienne a un paquetage standard, il n'est pas nécessaire de préfixer cette procédure

    L'appel de la procédure raise_application_error ne peut être exécuté que depuis une procédure stockée, et déclenche un retour immédiat au programme appelant en lui transmettant le code et le libellé de l'erreur

  3. #3
    Membre chevronné
    Avatar de Bibeleuh
    Homme Profil pro
    Développeur
    Inscrit en
    Septembre 2010
    Messages
    209
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2010
    Messages : 209
    Par défaut
    Il manque aussi le mot clé TRIGGER lors de la création de l'objet :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CREATE OR REPLACE TRIGGER Trig_Ins_Poste

  4. #4
    Candidat au Club
    Femme Profil pro
    Inscrit en
    Novembre 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 2
    Par défaut Aidez-moi à corriger l'erreur de ce déclencheur !
    bonjour;
    Trigger de contrainte sur la table poste permettant de refuser l’ajout d’un nouveau poste si la salle (idsalle) n’est pas traversée par le segment (idsegment) et si le nombre de postes de la salle dépasse 14.
    les table poste contient les colonnes suivantes:

    IDPOSTE NOMPOSTE IDSEGMENT AD TYPEPOSTE IDSALLE NBLOG
    p1 Poste 1 130.120.80 01 TX s01 0
    p2 Poste 2 130.120.80 02 LINUX s01 2
    p3 Poste 3 130.120.80 03 TX s01 0
    p4 Poste 4 130.120.80 04 PCXP s02 1
    p5 Poste 5 130.120.80 05 PCXP s02 0
    p6 Poste 6 130.120.80 06 LINUX s03 2
    p7 Poste 7 130.120.80 09 TX s03 0
    p8 Poste 8 130.120.81 01 LINUX s11 2
    p9 Poste 9 130.120.81 02 TX s11 0
    p10 Poste 10 130.120.81 03 LINUX s12 0
    p11 Poste 11 130.120.82 01 PCVI s21 2
    p12 Poste 12 130.120.82 02 PCXP s21 1

    la tables salle contient les colonne suivantes:

    IDSALLE NOMSALLE NBPOSTE IDSEGMENT
    s01 Salle 1 1 130.120.80
    s02 Salle 2 4 130.120.80
    s12 Salle 12 1 130.120.81
    s21 Salle 21 2 130.120.82

    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
    CREATE OR REPLACE TRIGGER Trig_insert_Poste
    BEFORE INSERT ON Poste
    FOR EACH ROW
    DECLARE
    v_nbp Salle.nbPoste%TYPE;
    v_idS Salle.idSegment%TYPE;
    BEGIN
    SELECT nbPoste, idSegment INTO v_nbp, v_idS
      FROM Salle 
    WHERE idSalle = :NEW.idSalle;
      IF v_idS != :NEW.idSegment  AND v_nbp > 14 THEN
    DBMS_OUTPUT.PUT_LINE ('la salle n apartien pa a idsegment ');
    END IF;
    END;
    /
    SHOW ERRORS;
    L;
    le trigger a été déclenché sans erreurs mais quand j'ai essayé d'insérer cette ligne qui ne respecte pas les conditions "if" il l'insert!!!!!!!!
    insert into poste
    values('p200', 'poste200' , '130.120.81' , '16' , 'TX' , 's02' ,'0');

  5. #5
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Deux remarques :
    • Pour empêcher l’insertion dans la table le trigger doit soulever une exception ce qui se fait habituellement via Raise_Application_Error. Dbms_Output ne fait qu’écrire un message dans un buffer.
    • En regardant vos données la salle 02 a seulement 4 postes donc inférieure à 14 donc elle respecte la condition du if

  6. #6
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Une troisième remarque, vous essayez de compenser par du code un problème inhérent à la modélisation.

    @mnitu : l'erreur doit être levée à cause du segment et pas du nombre de postes.

  7. #7
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Citation Envoyé par Waldar Voir le message
    ...@mnitu : l'erreur doit être levée à cause du segment et pas du nombre de postes.
    A ma compréhension l'erreur doit être levée si
    si la salle (idsalle) n’est pas traversée par le segment (idsegment) et si le nombre de postes de la salle dépasse 14.

  8. #8
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Ah oui !

Discussions similaires

  1. Erreur lors d'exécution d'un programme Java
    Par goldray dans le forum Débuter avec Java
    Réponses: 1
    Dernier message: 12/09/2013, 15h18
  2. Erreur lors d'exécution d'un serveur en WSMT
    Par sonson85 dans le forum Services Web
    Réponses: 0
    Dernier message: 15/05/2013, 18h11
  3. trigger me signal une erreur lors de son exécution
    Par scofild20 dans le forum SQL
    Réponses: 7
    Dernier message: 02/05/2009, 14h22
  4. Récupérer un erreur sur l'exécution d'un trigger
    Par tchoimars dans le forum PL/SQL
    Réponses: 1
    Dernier message: 06/06/2007, 16h07
  5. [JMF][débutant] Erreur lors de l'exécution
    Par july dans le forum Multimédia
    Réponses: 7
    Dernier message: 19/01/2006, 10h30

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