L'obtention de l'id après avoir insérer au sein d'une transaction (Oracle)
Disons que j'ai trois tables: l'équipe, le joueur, team_player. Tableau team_player est une table de bridge en permettant un "plusieurs à plusieurs" de la relation.
Quand quelqu'un veut créer une nouvelle équipe, ils précisent les initiales des joueurs de l'équipe.
Comment puis-je insérer à la fois l'équipe et team_player rangées dans la même transaction? C'est, je voudrais insérer toutes les team_player dossiers avant de s'engager dans la nouvelle équipe la ligne. Je suis à l'aide de JDBC et Oracle.
Quand j'ai essayer le code ci-dessous, teamId est rempli avec une chaîne de lettres, même si l'équipe.id est un nombre (qui est incrémenté par un déclencheur). Donc, cela ne semble pas être l'id de l'enregistrement que je viens d'essayé d'insérer (mais il n'a pas s'engager pour le moment).
c = DB.getConnection();
c.setAutoCommit(false);
sql = "INSERT INTO team (name) values (?)";
myInsert = c.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
myInsert.setString(1, "cougars");
int affectedRows = memoInsert.executeUpdate();
String teamId;
ResultSet generatedKeys = myInsert.getGeneratedKeys();
if (generatedKeys.next()) {
teamId = generatedKeys.getString(1);
}
//...loop through players inserting each player and team.id into team_player
//c.commit();
C'est là que j'ai lu sur RETURN_GENERATED_KEYS:
Comment faire pour obtenir l'insert ID en JDBC?
OriginalL'auteur latj | 2013-07-03
Vous devez vous connecter pour publier un commentaire.
L'Oracle JDBC Driver ne supporte pas
getGeneratedKeys()
- vous de générer manuellement les clés de votre détente, sans doute à partir d'unSEQUENCE
.Vous pouvez utiliser Oracle retour à la clause:
Ou prendre le dernier numéro de séquence avec une deuxième requête SQL:
J'ai eu quelques erreurs évidentes, réponse édité, espérons que cela fonctionne maintenant.
C'est travaillé. Juste par curiosité... j'ai évité l'option n ° 2 que vous avez donné à moi parce que je ne comprends totalement. Si je fais une deuxième requête, n'est pas ce qu'il va être mauvais si quelqu'un d'autre succès que de séquence entre mes deux requêtes? De toute façon, merci encore.
CURVAL renvoie la dernière valeur de la séquence pour la session en cours, de sorte que le problème que vous décrivez ne se produira pas.
Oracle JDBC driver support
getGeneratedKeys()
si la colonne est remplie par un déclencheur.OriginalL'auteur samlewis
Veuillez vous référer à L'énoncé.getGeneratedKeys() - il vous donne en un jeu de résultats de clés générées.Je crois que c'est ce que vous cherchez.
Fondamentalement, Spring jdbc utilise cette approche pour récupérer les id générés (exemple de JdbcTemplate classe)
Moins élégante solution serait d'utiliser Oracle Le RETOUR de la clause , mais vous aurez à vous envelopper, vous insérer dans une procédure stockée pour récupérer l'id de
Il est de retour, vous ROWID . getGeneratedKeys documentation dit que si la colonne représente l'id n'est pas spécifié, puis le chauffeur décide pour vous apparemment, pour l'Oracle qu'il serait ROWID
OriginalL'auteur diy
Vous devez indiquer au pilote qui colonne de retour.
Si votre ID est peuplée par un déclencheur suivantes:
Que faire si getGeneratedKeys() a échoué en raison d'une perte de connexion. Comment enregistrement inséré sera rouleau soutenu ?
OriginalL'auteur a_horse_with_no_name