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 9i] auto-increment


Sujet :

Oracle

  1. #1
    Nouveau membre du Club
    Inscrit en
    Mars 2006
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 37
    Points : 26
    Points
    26
    Par défaut [oracle 9i] auto-increment
    bje tt le monde.
    je veu savoir si il y'a le type auto-increment ds oracle comme mysql.
    sinon comment je peu faire pour que oracle ajoute lui même l'identificateur de ma table??
    et merci d'avance

  2. #2
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Il n'y a pas de type auto-incrément comme mysql.

    Tu crées un SEQUENCE, et dans un trigger POST-INSERT FOR EACH ROWS, tu mets ton champ avec le n° de séquence suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    :new.identificateur := ma_sequence.nextval;

  3. #3
    Membre expert
    Avatar de LeoAnderson
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 938
    Points : 3 199
    Points
    3 199

  4. #4
    Membre éprouvé Avatar de Yorglaa
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    845
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Points : 931
    Points
    931
    Par défaut
    Citation Envoyé par McM
    Il n'y a pas de type auto-incrément comme mysql.

    Tu crées un SEQUENCE, et dans un trigger POST-INSERT FOR EACH ROWS, tu mets ton champ avec le n° de séquence suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    :new.identificateur := ma_sequence.nextval;
    c'est lourd le trigger !!

    pourquoi ne pas faire l'insert directement en appelant la séquence ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Insert into ma table
         ( monID, ... )
    Values
         ( maSequence.NextVal, ...) ;

  5. #5
    Membre expert
    Avatar de LeoAnderson
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 938
    Points : 3 199
    Points
    3 199
    Par défaut
    Le trigger n'est pas si lourd et surtout il a l'immense avantage d'uniformiser toutes les procédures d'insertion.
    On ne spécifie pas de valeur pour la colonne auto-incrémentée et hop, tout toule tout seul ! :-)

    Sinon, il faut tout reprendre l'application dès que l'on change un petit truc...

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 45
    Points : 52
    Points
    52
    Par défaut
    Pas de valeur auto-incrémentée, il faut écrire une séquence.

    Ce que j'ai l'habitude de faire, c'est un package sur la table avec un tas de procédure (fonction) comprenant les inserts sur la table, des select (return un record), un update avec check si la ligne existe (si oui --> update, sinon insert)...

  7. #7
    Nouveau membre du Club
    Inscrit en
    Mars 2006
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 37
    Points : 26
    Points
    26
    Par défaut
    moi je travail avec les EJBs (de type CMP), pour insérer un enregistrement ds une table j'appel la fonction create(je mets lici les paramétres + identificateur)
    donc comment je peut appeler les sequences pour éviter de passer le paramétre identificateur ds la liste des paramétres de la fonction create

    et merci d'avance

  8. #8
    Membre éprouvé Avatar de Yorglaa
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    845
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Points : 931
    Points
    931
    Par défaut
    Citation Envoyé par LeoAnderson
    ...Sinon, il faut tout reprendre l'application dès que l'on change un petit truc...
    Ca dépend où tu gères l'insert...
    dans le cadre d'une base de donnée multi-application, il plus simple (à mon avis) d'avoir des prcédures (dans des packages pour ce qui me concerne) d'insertion qui reçoivent en paramètre les données "utilisateur" à insérer.

    pour le coup, toutes les colonnes "à valeur automatique" (séquences, USER, sysdate (pour date de création), etc...) sont renseignée dans ces procédures.

    du coup toutes les applis peuvent appeler la même procédure.

    donc pour la séquence dont on parle ici, le "séquence.NexVal" est justement dans cette procédure.

  9. #9
    Membre expert
    Avatar de LeoAnderson
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 938
    Points : 3 199
    Points
    3 199
    Par défaut
    Citation Envoyé par Yorglaa
    donc pour la séquence dont on parle ici, le "séquence.NexVal" est justement dans cette procédure.
    Certes mais tu n'es absolument pas certain que cette procédure sera TOUJOURS appellée, dans tous les cheminements de l'application et en plus, si tu souhaites par exemple faire un import/SQL*Loader, cette procédure ne sera pas appellée.
    Avec alors le risque d'avoir une séquence non en phase avec les données (séquence inférieure au max) ce qui provoquerait des erreurs de doublons sur la prochaine insertion avec la-dite procédure !

    Donc, à mes yeux, il n'y a que la solution du trigger qui soit satisfaisante ! ;-)

  10. #10
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    De plus dans des applis comme Forms, comment tu gères tes procédures d'insertion ?

  11. #11
    Membre éprouvé Avatar de Yorglaa
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    845
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Points : 931
    Points
    931
    Par défaut
    @LeoAnderson
    c'est juste, je suis d'accord avec cet argument...
    mais je suppose que dans n'importe quel contexte, l'utilisation d'outils comme SQLLoader demande une certaine systématique / discipline dans leur utilisation.

    @McM
    je ne sais pas, je n'utilise pas Forms...
    mais à priori rien n'empêche d'appeler des procs stockées depuis Forms... si ?

  12. #12
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par Yorglaa
    @McM
    je ne sais pas, je n'utilise pas Forms...
    mais à priori rien n'empêche d'appeler des procs stockées depuis Forms... si ?
    Ben Forms gère automatiquement les ordres SQL d'insert, update,etc...
    donc pour insérer à partir d'une procédure, ça marche pas.

  13. #13
    Membre régulier
    Inscrit en
    Mars 2006
    Messages
    88
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 88
    Points : 95
    Points
    95
    Par défaut
    Citation Envoyé par LeoAnderson
    Citation Envoyé par Yorglaa
    donc pour la séquence dont on parle ici, le "séquence.NexVal" est justement dans cette procédure.
    Certes mais tu n'es absolument pas certain que cette procédure sera TOUJOURS appellée, dans tous les cheminements de l'application et en plus, si tu souhaites par exemple faire un import/SQL*Loader, cette procédure ne sera pas appellée.
    Avec alors le risque d'avoir une séquence non en phase avec les données (séquence inférieure au max) ce qui provoquerait des erreurs de doublons sur la prochaine insertion avec la-dite procédure !

    Donc, à mes yeux, il n'y a que la solution du trigger qui soit satisfaisante ! ;-)
    Je n'insère jamais directement dans la table source avec un SQL-Loader. J'utilise tjs une table intermédiaire qui permet de faire toutes les vérifications avant la vraie insertion dans la table cible. Cela évite d'avoir à gérer des "rollbacks à la main" pour annuler un chgt qui a planté à moitié. Le SQL-Loader ne permet pas d'annuler facilement une transaction s'il y a une erreur. Il rejette les enregistrements purement et simplement. Gérer une table temporaire permet de valider ou annuler la transaction en entier.

    @+,
    NicK.

  14. #14
    Membre expert
    Avatar de LeoAnderson
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 938
    Points : 3 199
    Points
    3 199
    Par défaut
    Citation Envoyé par Yorglaa
    (...)mais je suppose que (...)
    C'est bien là le problème... tu ne fais que supposer... tu ouvres donc la voie aux "avec de la chance ça devrait le faire" ou autres approximations. C'est pour ça que je préfère blinder avec un trigger...

  15. #15
    Membre éprouvé Avatar de Yorglaa
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    845
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Points : 931
    Points
    931
    Par défaut
    Je me permets de supposer ici parce que je ne connais ni ne contrôle les environnements des autres personnes ici présentes...

    Pour ce qui est de(s) environnement(s) dont je suis en charge, c'est une certitude !

  16. #16
    Nouveau membre du Club
    Inscrit en
    Mars 2006
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 37
    Points : 26
    Points
    26
    Par défaut
    bjr

    moi je travail avec les EJBs (de type CMP), pour insérer un enregistrement ds une table j'appel la fonction create(je mets lici les paramétres + identificateur)
    donc comment je peut appeler les sequences pour éviter de passer le paramétre identificateur ds la liste des paramétres de la fonction create

    et merci d'avance

Discussions similaires

  1. auto-increment sous oracle
    Par kinshinori dans le forum Oracle
    Réponses: 2
    Dernier message: 17/05/2010, 16h10
  2. Auto increment sur Oracle
    Par intissar_g dans le forum SQL
    Réponses: 3
    Dernier message: 30/09/2008, 15h06
  3. [EJB2.1 Entity] [Oracle] auto-increment
    Par jamal_b dans le forum Java EE
    Réponses: 10
    Dernier message: 25/08/2006, 13h57
  4. [Oracle 10g] Auto Increment
    Par cnguyen dans le forum Oracle
    Réponses: 15
    Dernier message: 04/07/2006, 12h13
  5. auto incremente + ORACLE?? (intégré à la FAQ)
    Par oceane751 dans le forum Oracle
    Réponses: 4
    Dernier message: 20/01/2006, 17h18

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