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 :

Oracle insert erreur


Sujet :

Oracle

  1. #1
    Débutant  
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 225
    Points : 132
    Points
    132
    Par défaut Oracle insert erreur
    Bonjour,

    Je suis sous oracle et je cherche à gérer l'auto_incrémentation. J'ai donc créé une séquence et un trigger mais par exemple quand j'ai une erreur dans un insert, j'ai mon id qui reste quand même en mémoire même si mon insert 'na pas lieu: par exemple, j'ai 1 - 2 - 4 au lieu de 1 - 2 - 3.
    Je cherche donc un moyen de vérifier que mon insert ne retourne pas d'erreur et s'il n'y a pas d'erreur j'incrémente mon id.
    Voici un de mes triggers qui gère l'auto incrémentation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    create or replace TRIGGER "AUTO_PIECE" 
    BEFORE INSERT ON PIECE
    FOR EACH ROW
    BEGIN
    SELECT PIECE_SEQ.nextval INTO :new.idPiece FROM DUAL;
    END;
    Merci de votre aide

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 111
    Points : 28 466
    Points
    28 466
    Par défaut
    Poser une nouvelle fois la question ne changera pas la réponse.

  3. #3
    Débutant  
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 225
    Points : 132
    Points
    132
    Par défaut
    Il y aucun moyen de vérifier si un insert retourne une erreur ou pas

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 111
    Points : 28 466
    Points
    28 466
    Par défaut
    Je vais réitérer ma réponse :
    • Le trigger s'exécute avant l'insertion dans la table (BEFORE INSERT).
    • Si l'enregistrement de la ligne est refusé parce qu'elle ne respecte pas les contraintes, cela ne se fera donc qu'après que le trigger ait été exécuté et la séquence incrémentée.
    • Lorsque le programme qui a effectué l'insertion reçoit l'erreur d'exécution, il n'est pas impossible q'une autre ligne ait été insérée après celle qui est en erreur.
    • Il n'est alors plus possible de modifier la séquence puisqu'elle indique bien la dernière valeur affectée.

    Qu'est-ce qui n'est pas clair ?

  5. #5
    Débutant  
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 225
    Points : 132
    Points
    132
    Par défaut
    Il y pas de moyen pour que le trigger s'exécute que si j'ai pas d'erreur dans l'insert

  6. #6
    Débutant  
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 225
    Points : 132
    Points
    132
    Par défaut
    Si je fait ceci, c'est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    create or replace TRIGGER "AUTO_TYPE_AVION" 
    BEFORE INSERT ON PIECE
    FOR EACH ROW
    DECLARE
    idMax NUMBER;
    BEGIN
    SELECT MAX(idPiece) INTO idMax FROM PIECE;
    :new.idPiece:= idMax +1; 
    END;

  7. #7
    Expert éminent sénior 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
    Points : 11 252
    Points
    11 252
    Par défaut
    Citation Envoyé par totot Voir le message
    Si je fait ceci, c'est
    ... un bug (en fait il y en a plusieurs)!

  8. #8
    Débutant  
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 225
    Points : 132
    Points
    132
    Par défaut
    Je voulais demander si c'est bon mais je me rencontre que non

  9. #9
    Expert éminent sénior 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
    Points : 11 252
    Points
    11 252
    Par défaut
    bug parce que
    • Select Max peut envoyer NULL
    • Le niveau d'isolation des transactions par défaut d'Oracle (read commited) fait que votre select pourrais ne pas voir une valeur maximale "correcte". Autrement dit votre trigger risque de générer des doublon parfois.
    • Ce type de trigger génère l'erreur de la table en mutation

  10. #10
    Débutant  
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 225
    Points : 132
    Points
    132
    Par défaut
    Ok
    Je vais laisser comme c'est et puis cela provoquera des trous si mon insert n'a pas lieu pour cause d'erreur

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

Discussions similaires

  1. [Oracle 9i]: erreur ORA-01925 (max enables roles)
    Par NPortmann dans le forum Oracle
    Réponses: 2
    Dernier message: 30/03/2007, 09h39
  2. [Oracle 9i] Erreur d'import IMP-00008
    Par zestrellita dans le forum Oracle
    Réponses: 2
    Dernier message: 05/05/2006, 11h39
  3. [Oracle] Insert avec récupération valeur de la cle
    Par Silvia12 dans le forum Oracle
    Réponses: 2
    Dernier message: 11/03/2006, 03h28
  4. [Forms10g/oracle 9i] erreur ORA-01652
    Par marcalexis dans le forum Oracle
    Réponses: 6
    Dernier message: 14/02/2006, 18h30
  5. [Oracle 9i] Erreur: wrong incarnation of this file
    Par shaun_the_sheep dans le forum Oracle
    Réponses: 5
    Dernier message: 26/11/2004, 10h53

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