9
votes

Obtenir une pièce d'identité insérée après l'insertion ... Sélectionnez sur Oracle

Cette instruction SQL fonctionne si je l'exécute à partir de mon client Oracle (développeur SQL): xxx pré>

Cela fonctionne également si je le délivrai via Spring JDBC, sans utiliser de Terrouilleur : P> xxx pré>

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> xxx pré>

... Puis je reçois cette erreur: 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);
  • Spring JDBC 3.0.3.Release Li>
  • Pilote JDBC: OJDBC6.jar Version 11.2.0.1.0 LI>
  • RDBMS: Oracle9i version 9.2.0.5.0 - Production LI>
  • Commons-DBCP 1.4 LI> ul>

    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>


0 commentaires

4 Réponses :


1
votes

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

Vous utilisez donc la mauvaise méthode. Essayez xxx

au lieu de


2 commentaires

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



0
votes

Que diriez-vous de

INSERT INTO blah b (blah1, blah2, blah3)
VALUES (?, ?, ?) RETURNING b.id INTO ?";


1 commentaires

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.



0
votes

Cette fonctionnalité n'est pas prise en charge par le pilote Oracle JDBC


1 commentaires

C'est ce que je devine; Avez-vous une référence pour cela?



0
votes

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.


0 commentaires