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

JDBC Java Discussion :

[JDBC]Récuperer une clef primaire


Sujet :

JDBC Java

  1. #1
    Futur Membre du Club
    Inscrit en
    Mai 2005
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 14
    Points : 5
    Points
    5
    Par défaut [JDBC]Récuperer une clef primaire
    Bonjour,

    Je pense que c'est un truc très con mais bizarrement j'y arrive pas ...

    Alors voici mon problème :
    J'ai une base Oracle (9.i) contenant 3 tables.

    Dans l'une d'elle j'utilise une clef étrangère.

    Donc quand j'insère une donnée dans l'une j'ai besoin de la clef primaire pour inserer une donnée dans l'autre table.

    En gros :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    //J'insere dans la table A
    Statement stmt;
    stmt = connection.createStatement();
    stmt.executeUpdate(sqlRequete);
     
    //Je recupere la clef primaire
    primaryKey = ???;
     
    //J'insere dans ma nouvelle table ma nouvelle donnée
    Le problème est donc de récuperer cette clef primaire.

    J'ai tenté d'utiliser ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ResultSet resultset = stmt.getGeneratedKeys();
    			if (resultset.next()){
    				sreturn  = resultset.getString(1);
    			}
    Mais mon driver ne supporte pas cette fonction (driver imposé)

    Merci d'avance.

  2. #2
    Rédacteur
    Avatar de _Mac_
    Profil pro
    Inscrit en
    Août 2005
    Messages
    9 601
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 9 601
    Points : 12 977
    Points
    12 977
    Par défaut
    Comment elle est calculée et ajoutée à tes données, ta clé primaire ?

    Du détail, du détail, du détail !!!
    Revenons à la source : lisons la documentation et les fichiers de trace, la réponse à notre problème s'y trouve sans doute

  3. #3
    Rédacteur
    Avatar de _Mac_
    Profil pro
    Inscrit en
    Août 2005
    Messages
    9 601
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 9 601
    Points : 12 977
    Points
    12 977
    Par défaut
    T'as essayé avec les preparedStatement ? Y a un paramètre pour dire s'il le driver doit renvoyer les clés qu'il a calculé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    String requete = "INSERT INTO matable (colonne1, colonne2) VALUES (?, ?)";
    PreparedStatement stmt = connection.prepareStatement(requete, Statement.RETURN_GENERATED_KEYS);

    Du détail, du détail, du détail !!!
    Revenons à la source : lisons la documentation et les fichiers de trace, la réponse à notre problème s'y trouve sans doute

  4. #4
    Futur Membre du Club
    Inscrit en
    Mai 2005
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 14
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par _Mac_
    Comment elle est calculée et ajoutée à tes données, ta clé primaire ?
    La clef primaire est calculé par la base oracle (sequence) donc je ne la remplis pas moi meme si c'est ce que tu veux savoir

  5. #5
    Futur Membre du Club
    Inscrit en
    Mai 2005
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 14
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par _Mac_
    T'as essayé avec les preparedStatement ? Y a un paramètre pour dire s'il le driver doit renvoyer les clés qu'il a calculé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    String requete = "INSERT INTO matable (colonne1, colonne2) VALUES (?, ?)";
    PreparedStatement stmt = connection.prepareStatement(requete, Statement.RETURN_GENERATED_KEYS);
    non je n'ai pas essayé mais je vais voir ca.

    Par contre comment est elle renvoyé la clef en utilisant ceci ? et Comment la récupere-t-on ?

    Merci quoi qu'il en soit.

  6. #6
    Rédacteur
    Avatar de _Mac_
    Profil pro
    Inscrit en
    Août 2005
    Messages
    9 601
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 9 601
    Points : 12 977
    Points
    12 977
    Par défaut
    Ben, tu me poses la question, mais c'est plutôt à toi de nous le dire !! Si tu prévois d'utiliser stmt.getGeneratedKeys(), c'est que tu en as une idée, non ? Et c'est le sens de ma question initiale.

    Généralement, on écrit son propre générateur de clé primaire, ce qui évite d'avoir ce genre de problème. Du moins, c'est ce que j'ai toujours vu.

    Du détail, du détail, du détail !!!
    Revenons à la source : lisons la documentation et les fichiers de trace, la réponse à notre problème s'y trouve sans doute

  7. #7
    Futur Membre du Club
    Inscrit en
    Mai 2005
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 14
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par _Mac_
    Ben, tu me poses la question, mais c'est plutôt à toi de nous le dire !! Si tu prévois d'utiliser stmt.getGeneratedKeys(), c'est que tu en as une idée, non ? Et c'est le sens de ma question initiale.

    Généralement, on écrit son propre générateur de clé primaire, ce qui évite d'avoir ce genre de problème. Du moins, c'est ce que j'ai toujours vu.
    bah le probleme c'est que je n'ai pas ecris le code initiale, je fais une maintenance du code existant...

  8. #8
    NGY
    NGY est déconnecté
    Membre habitué
    Inscrit en
    Août 2002
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 137
    Points : 164
    Points
    164
    Par défaut
    Mais il fait quoi le code initial ? Que veux-tu changer ?
    Est-ce qu'il fonctionnait ? Si oui, comment est géré le INSERT ?

    Sinon, je suis d'accord avec _Mac_. D'ailleurs, ce sujet a déjà été abordé :
    [Résolu] [JDBC] récupération de clé auto-générée lors d'une insertion

  9. #9
    Futur Membre du Club
    Inscrit en
    Mai 2005
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 14
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par NGY
    Mais il fait quoi le code initial ? Que veux-tu changer ?
    Est-ce qu'il fonctionnait ? Si oui, comment est géré le INSERT ?

    Sinon, je suis d'accord avec boubavic. D'ailleurs, ce sujet a déjà été abordé :
    [Résolu] [JDBC] récupération de clé auto-générée lors d'une insertion
    En fait, il n'y avait que 2 tables sans clef etrangere au depart, et mon evolution rajoute une 3eme table.

    La clef primaire est générée de la maniere suivante : DME_SEQ.nextval

    Par contre merci pour le lien il devrait m'aider pour la suite.

  10. #10
    Futur Membre du Club
    Inscrit en
    Mai 2005
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 14
    Points : 5
    Points
    5
    Par défaut
    par contre j'ai toujours le meme probleme en fait.

    la fonction getGeneratedKeys() n'est pas supporté par mon driver (Exception : Exception Fonction non prise en charge)

  11. #11
    NGY
    NGY est déconnecté
    Membre habitué
    Inscrit en
    Août 2002
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 137
    Points : 164
    Points
    164
    Par défaut
    La clef primaire est générée de la maniere suivante : DME_SEQ.nextval
    Donc tu utilises une séquence (normal, c'est quand même bien pratique !)

    La méthode est simple, il faut faire l'INSERT en 2 temps :
    1. Récupérer la valeur envoyée par DME_SEQ.nextval dans un int
    2. Te servir de cette valeur pour envoyer ta requête INSERT

    Ensuite, tu peux ré-utiliser la valeur du int comme clé étrangère lors du 2eme INSERT

    [Edit]Je viens de me rendre compte que c'est exactement ce que j'ai dit dans le post mentionné ci-dessus ! Comme quoi, je suis au moins cohérent avec moi-même. [/Edit]

  12. #12
    Futur Membre du Club
    Inscrit en
    Mai 2005
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 14
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par NGY
    La clef primaire est générée de la maniere suivante : DME_SEQ.nextval
    Donc tu utilises une séquence (normal, c'est quand même bien pratique !)

    La méthode est simple, il faut faire l'INSERT en 2 temps :
    1. Récupérer la valeur envoyée par DME_SEQ.nextval dans un int
    2. Te servir de cette valeur pour envoyer ta requête INSERT

    Ensuite, tu peux ré-utiliser la valeur du int comme clé étrangère lors du 2eme INSERT
    C'est certain que c'est beaucoup plus simple comme ca ... pourquoi ne pas y avoir penser plus tôt

    Merci en tout cas

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 22/08/2010, 17h40
  2. Réponses: 3
    Dernier message: 24/07/2007, 18h06
  3. Probleme d'insertion d'une clef primaire OleAdo
    Par blondelle dans le forum C++Builder
    Réponses: 1
    Dernier message: 26/03/2007, 12h23
  4. Générer une clef primaire aleatoire?
    Par 12_darte_12 dans le forum Administration
    Réponses: 4
    Dernier message: 18/07/2005, 18h10
  5. Comment comment définir une clef primaire dans une table??
    Par nek_kro_kvlt dans le forum Bases de données
    Réponses: 4
    Dernier message: 07/02/2005, 21h06

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