2016-05-27 6 views
0
PreparedStatement updateSeq = null; 
String createQuery ="CREATE SEQUENCE AVIA START WITH ? INCREMENT BY 1"; 
try { 
    con.setAutoCommit(false); 
    updateSeq = con.prepareStatement(createQuery); 
    updateSeq.setLong(1, 1000000000000000l); 
    updateSeq.executeUpdate(); 
    con.commit(); 
} catch (SQLException e) { 
    e.printStackTrace(); 
} finally { 
    try { 
     updateSeq.close(); 
     con.setAutoCommit(true); 
    } catch (SQLException e) { 
     e.printStackTrace(); 
    } 
} 

Das gibt mir "java.sql.SQLSyntaxErrorException: ORA-01722: ungültige Nummer" , was mache ich falsch.Erstellen Sequenz in Oracle mit JDBC PreparedStatment

+0

Müssen Sie dafür wirklich eine parametrisierte Abfrage verwenden? Sie schreiben den Wert des Parameters trotzdem fest, so dass Sie ihn stattdessen auch in die Zeichenfolge fest codieren können. – JonK

+0

Haben Sie versucht, das "l" zu entfernen? –

+0

@ JonK Ja, ich musste eine neue Anweisung basierend auf dem Schema erstellen, für jedes Schema musste ich den Index ändern, alles bleibt gleich. Wie du erwähnt hast, werde ich die Zeichenfolge erstellen. – user2478236

Antwort

3

Sie können nur Laufzeitwerte parametrisieren, nicht Elemente der Anweisung, die bekannt sein müssen und zur Parsezeit festgelegt werden müssen. Für Datendefinitionsanweisungen (DDL-Anweisungen) bedeutet dies effektiv, dass Sie überhaupt keine Parameter verwenden können.

Der Bindungsplatzhalter ? wird bei der Parsezeit als Literalzeichen betrachtet - es wird keine Bindesubstitution durchgeführt - und der Fehler sagt, dass ein Fragezeichen keine gültige Zahl ist und nicht implizit in eine konvertiert werden kann. Sie haben den Fehler-Stack nicht angezeigt, aber er sollte vom prepareStatement()-Aufruf stammen, nicht vom executeUpdate()-Aufruf.

Obwohl die Beratung ist in der Regel (ganz korrekt) Parameter zu verwenden, manchmal nur es nicht möglich ist, so dass Sie den Startwert verketten müssen werden:

createQuery ="CREATE SEQUENCE AVIA START WITH " + startVal + " INCREMENT BY 1"; 

Auch in diesem Fall den Wert, den Sie ist unter Verwendung fester zu sein scheint sind Sie vielleicht auch nur, dass in der Zeichenfolge:

createQuery ="CREATE SEQUENCE AVIA START WITH 1000000000000000 INCREMENT BY 1"; 

und dann könnten Sie auch eine einfache Aussage eher als eine vorbereitete Anweisung verwenden, und es einfach auszuführen.

Übrigens, DDL auch implizit, so dass sowohl das automatische Festschreiben deaktivieren und dann manuell committen sind sinnlos.

+0

@ Alex Poole danke für die detaillierte Erklärung, wie Sie für meine Anforderung verketten erwähnt haben, könnte der Weg zu gehen. – user2478236