2017-05-19 12 views
0

Ich habe App Java und seine für JDBC verbinden und führen Sie diese Abfrage:Fehler in SQL-Orakel

String date = '21-Dec-16'; 
StringBuilder query = new StringBuilder("SELECT * "); 
query.append("FROM TEST WHERE PUBLISHED_DATE='").append(date).append("'"); 
connection = getConnection(jdbc); 
stmt = connection.createStatement(); 
rs = stmt.executeQuery(query.toString()); 

syso query => select * from TEST where PUBLISHED_DATE='21-Dec-16' 

und Fehler:

java.sql.SQLDataException: ORA-01858: a non-numeric character was found where a numeric was expected 

i zu Test:

select * from TEST where PUBLISHED_DATE=TO_DATE('21-Dec-16','DD-MON-RR') 

und Fehler:

java.sql.SQLDataException: ORA-01843: not a valid month 

Trotzdem führe ich diese Abfrage in meinem SQL-Entwickler und funktioniert!

+2

Wo ist das Datum definiert? Übrigens sollten Sie hier eine vorbereitete Aussage verwenden, Ihr aktueller Ansatz ist voller Probleme. –

+0

Was ist, wenn Sie es mit diesem Format "DD-MM-YYYY '" versuchen –

+1

'MON' hängt von der Sprache ab, die in Ihren Sitzungseinstellungen definiert ist. Tun Sie sich selbst einen Gefallen und benutzen Sie einfach "MM". – Tom

Antwort

0

Wenn Sie dieses Format für Daten verwenden möchten, müssen Sie die Spracheinstellungen Ihres Datenbanksitzung ändern:

Statement s = connection.createStatement(); 
s.execute("alter session set NLS_LANGUAGE = 'AMERICAN'"); 

und dann können Sie die TO_DATE Funktion wie in Ihrem zweiten Beispiel.

+0

danke, es ist korrekt! – sirdaiz

1

Die unmittelbare Ursache Ihres Fehlers ist, dass Sie ein Datumsformat verwenden, das für eine Oracle-Abfrage falsch ist. Aber abgesehen davon sollten Sie ernsthaft darüber nachdenken, eine vorbereitete Aussage hier zu verwenden. Zusätzlich zum Schutz Ihres Programms gegen SQL-Injection wird es Ihnen auch helfen, sich darüber Gedanken zu machen, wie Sie Ihr Datum für die Abfrage formatieren können. Stattdessen können Sie das direkte Java-Datumsobjekt einfach an die Abfrage binden.

String query = "SELECT * FROM TEST WHERE PUBLISHED_DATE = ?"; 
PreparedStatement stmt = connection.prepareStatement(query); 
stmt.setDate(1, date); // here 'date' is an actual Date object, not a string 
ResultSet rs = stmt.executeQuery(); 
while (rs.next()) { 
    // access each record 
} 

Wenn Sie unbedingt Ihren aktuellen Weg fortsetzen muss, würde ich die folgende Ausgang Abfrage erwarten, ohne Fehler auszuführen:

SELECT * FROM TEST WHERE PUBLISHED_DATE = '2016-12-21' 

Sie ein Java SimpleDateFormat Objekt verwenden, könnten dies von einem Date Objekt zu erhalten .

Verwandte Themen