Précédent   Forum des professionnels en informatique > Java > Général Java > JDBC
JDBC Forum d'entraide sur l'API JDBC (Java Database Connectivity) et l'accès aux bases de données. Avant de poster -> FAQ JDBC
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 14/12/2011, 18h24   #1
Invité de passage
 
Ingénieur développement logiciels
Inscription : juin 2011
Messages : 26
Détails du profil
Informations personnelles :
Localisation : France

Informations professionnelles :
Activité : Ingénieur développement logiciels

Informations forums :
Inscription : juin 2011
Messages : 26
Points : 2
Points : 2
Par défaut [Oracle] Récupérer clé primaire après insertion ?

Bonsoir,

je tente de faire un insert sous oracle en mettant à jour la séquence via un nextval, et surtout je voudrais récupérer la valeur utilisée en sortie...

J'ai lu que sur les prepared statement y a moyen de donner le nom d'une colonne à surveiller, et de pouvoir récupérer un resulset avec la valeur mise à jour mais cela ne semble pas fonctionner.

Qqun sait il si cela fonctionne sous Oracle, ou si c'est seulement dédié aux SGBD ayant une clé autoincrémentale ?

merci.
Nalonna est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2011, 18h52   #2
Invité de passage
 
Ingénieur développement logiciels
Inscription : juin 2011
Messages : 26
Détails du profil
Informations personnelles :
Localisation : France

Informations professionnelles :
Activité : Ingénieur développement logiciels

Informations forums :
Inscription : juin 2011
Messages : 26
Points : 2
Points : 2
Voici un exemple trouvé sur un autre topic que je modifie légèrement pour faire comprendre ce que je tente de faire :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 
public int ADDProduit(String ope, String abo, String marque, String ref, String prix,String lib) {
        try {
            String[] column ={"idProd"};
            PreparedStatement AddProd = con.prepareStatement("INSERT INTO produits (idProd,marque,reference,libelle, libAbo,libOp,prixProd) VALUES(SEQ_PROD.nextval,?,?,?,?,?,?)",column);
            AddProd.setString(1,marque);
            AddProd.setString(2,ref);
            AddProd.setString(3,lib);
            AddProd.setString(4,abo);
            AddProd.setString(5,ope);
            AddProd.setString(6,prix);
 
            AddProd.executeUpdate();
            ResultSet rs = AddProd.getGeneratedKeys();
            if (rs.next())
                return rs.getInt(1);
            else return null;
        } catch (SQLException e) {
        }
 
    }
Nalonna est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2011, 19h52   #3
Invité de passage
 
Ingénieur développement logiciels
Inscription : juin 2011
Messages : 26
Détails du profil
Informations personnelles :
Localisation : France

Informations professionnelles :
Activité : Ingénieur développement logiciels

Informations forums :
Inscription : juin 2011
Messages : 26
Points : 2
Points : 2
Désolée d'être insistante, mais je voudrais vraiment trouver une solution à ce pb.

J'ai lu qq part que certains font des procédures en "ligne". Je ne trouve pas d'exemple concret donc je présume qu'ils font appel à un CallableStatement de ce style :

Code :
1
2
3
4
5
6
7
 
CallableStatement statement = connection.prepareCall(sql);
statement.registerOutParameter(1,Types.INTEGER);
statement.setString(1,"test");
...
statement.execute();
System.out.println(statement.getInt(1));
avec une requete SQL de ce style me concernant :

Code :
1
2
3
4
5
6
7
 
DECLARE IDHIST INTEGER;
BEGIN
            insert into TEST(test_ID, test_toto, ...) 
            values (S_TEST.nextval, ?, ...)
            returning test_ID INTO IDHIST;
END;
J'ai fait un test, mais pas moyen d'avoir la valeur....mon getInt(1) me renvoie toujours 0.

Des idées ?

Merci.
Nalonna est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/12/2011, 02h36   #4
Modérateur
 
Avatar de sinok
 
Inscription : août 2004
Messages : 8 227
Détails du profil
Informations personnelles :
Âge : 32
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : août 2004
Messages : 8 227
Points : 10 910
Points : 10 910
La façon de faire la plus évidente est de récupérer le nextval de ta séquance au préalable.

Genre de faire un
Code :
select SEQ_PROD.nextval  from DUAL
, de récupérer cette valeur puis d'exécuter l'ordre insert en utilisant la valeur récupérée.

Ok, ce n'est pas forcément hyper optimisé et c'est de la triche, mais ça marche plutôt pas mal
__________________
Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.
sinok est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 04h58.


 
 
 
 
Partenaires

Hébergement Web