2010-08-10 3 views
3

J'utilise des déclencheurs pour définir les valeurs de colonne PK de toutes les tables, donc je ne fais aucune opération sur les ID dans java mais j'ai besoin de l'ID après l'insertion.Java JDBC Récupérer l'ID après l'insertion

Comment puis-je obtenir l'ID?

stat.execute("INSERT INTO TPROJECT_PROCESS_GROUP(NPROJECT_ID,VDESCRIPTION) " + 
       "VALUES(" + 
       "'" + projectID + "'," + 
       "'" + description + "'" + 
       ""); 

Edit: Salut à nouveau je lis la question, maintenant, je reçois une exception comme « opération non prise en charge » (i traduit de ma langue maternelle la forme anglaise exacte peut être différente). Je suppose que cela concerne le support d'Oracle pour GetGeneratedKeys? Sais tu quelque chose à propos de cela? Solution: Comme mentionné dans un livre sur les instructions d'appel Cette instruction peut être utilisée pour exécuter des procédures stockées et des fonctions. Contrairement à PreparedStatement, la plupart des bases de données n'effectuent aucune préparation pour l'appel, car c'est une commande si simple. Les instances CallableStatement peuvent être utilisées pour retourner l'objet que la procédure stockée ou la fonction, pour être plus exact, retourné.

OracleConnection conn = null; 
    //OraclePreparedStatement pstat = null; 
    OracleCallableStatement cstat = null; 
    String sql = "BEGIN INSERT INTO TPROJECT P (VPROJECT_TITLE,VPROJECT_DESC) VALUES(?,?) RETURNING P.NPROJECT_ID INTO ?; END;"; 
    try { 
     conn = ConnectionUtility.GetConnection(); 
     cstat = (OracleCallableStatement)conn.prepareCall(sql); 

     cstat.setString(1, title); 
     cstat.setString(2, description); 
     cstat.registerOutParameter(3, OracleTypes.NUMBER); 
     cstat.execute(); 

     int returnedID = cstat.getInt(3); 
//   System.out.println(returnedID); 

     conn.close(); 

     return returnedID; 
+3

en double de [JDBC: Comment peut-on s'insérer ID d'enregistrement en Java] (http://stackoverflow.com/questions/1915166/jdbc-how-can -we-get-insert-inscript-id-in-java) Notez que votre instruction est sensible aux injections SQL. Vous devriez préférer 'PreparedStatement' à' Statement '. – BalusC

+0

En fait, je ne suis pas sûr si c'est un doublon * exact *, car ici, d'une certaine façon, un déclencheur est utilisé. – erickson

+0

@erickson: Le terme est en effet ambigu dans le contexte de la question, mais sous le capot, MySQL 'auto_increment', DB2/MSSQL' identity' et Oracle/PostgreSQL 'serial' utilisent tous des triggers. Je ne vois pas pourquoi on en créerait un personnalisé pour l'insertion d'identifiant. – BalusC

Répondre

5

Cet exemple est ce que vous feriez dans PostgreSQL. J'espère que vous pouvez faire quelque chose de similaire dans Oracle.

Voici comment obtenir l'ID après INSERT INTO pour les clés générées automatiquement comme série. Important ici est de fournir RETURN_GENERATED_KEYS dans l'appel prepareStatement().

Resultset result; 
PreparedStatement prep; 
String query = "INSERT INTO myRel (data) VALUES (?)"; 

prep = db.prepareStatement(query ,Statement.RETURN_GENERATED_KEYS); 

result = prep.getGeneratedKeys(); 

if(result.next() && result != null){ 
    System.out.println("Key: " + result.getInt(1)); 
} else { 
    System.out.println("No, Nop nada"); 
} 

espoir qui aide une personne :)

+0

Ne fonctionne pas pour Oracle du tout. De plus, ceci est déjà mentionné dans le 1er lien dans les commentaires de la question. – BalusC

+0

Non, je n'ai pas accès à Oracle, j'utilise Postgresql. J'espérais que le principe général s'appliquerait de toute façon, c'est JDBC afterall. – Ben

+0

cette réponse est nulle. Lire http://stackoverflow.com/questions/1915166/how-to-get-the-insert-id-in-jdbc – Flavius