Cette instruction SQL fonctionne si je l'exécute à partir de mon client Oracle (développeur SQL): Cela fonctionne également si je le délivrai via Spring JDBC, sans utiliser de Terrouilleur : P> Cependant, je dois utiliser un titulaire de clé pour obtenir l'ID de la ligne nouvellement insérée. Si je modifie le code ci-dessus pour utiliser un titulaire de clé comme suit: p> ... Puis je reçois cette erreur: p> n.b. Mon application doit utiliser standard SQL afin de rester en DB-Neutral, qui règne n'importe quel SQL spécifique à Oracle (je ne choisirai pas de "Dual" dans la vie réelle). P> Merci pour toute aide . p> p>final KeyHolder keyHolder = new GeneratedKeyHolder();
final PreparedStatementCreator psc = new PreparedStatementCreator() {
@Override
public PreparedStatement createPreparedStatement(Connection con)
throws SQLException
{
return con.prepareStatement(
"insert into Person (Name) values ('Bob')",
new String[] {"PersonID"});
}
};
jdbcOperations.update(psc, keyHolder);
4 Réponses :
java.sql.connection.preparation (java.lang.string, int) interface est clair
crée un objet préparé par défaut qui a la capacité
à extraire des touches générées automatiquement forte> p> BlockQuote> Vous utilisez donc la mauvaise méthode. Essayez p>
xxx pré> au lieu de p> p>
Cette méthode est l'une des trois pouvant renvoyer les clés générées, les deux autres préparations (chaîne, int []) et la préparation (chaîne, chaîne []). J'utilise ce dernier, lequel IME est le bon pour Oracle. Néanmoins, je vais essayer votre suggestion et vous faire savoir comment ça se passe.
@Andrew Swan Vous avez raison. Merci! Mais laissez-moi savoir la sortie
Que diriez-vous de
INSERT INTO blah b (blah1, blah2, blah3) VALUES (?, ?, ?) RETURNING b.id INTO ?";
Je ne peux pas utiliser d'insertion ... valeurs parce que j'ai besoin de sélectionner des choses. De plus, je ne veux pas utiliser de retour .. dans Afaik, il est spécifique à Oracle.
Cette fonctionnalité n'est pas prise en charge par le pilote Oracle JDBC P>
C'est ce que je devine; Avez-vous une référence pour cela?
Je suppose que l'utilisation d'un titulaire de clé avec une instruction INSERT SELECT n'est pas et ne sera pas prise en charge car le SELECT pourrait sélectionner avec théoriquement plusieurs lignes, et s'il n'ya eu aucun moyen de renvoyer ces multiples clés dans un seul titulaire de la clé. Pour ce que vous essayez d'accomplir, il sera probablement plus facile d'utiliser simplement une instruction SELECT suivie d'une instruction insertion. P>