2015-03-15 54 views
5

Po uruchomieniu tej kwerendy SELECT SYSDATE + INTERVAL '7' DAY FROM DUAL; w prepareStatement jak tenUzyskiwanie błąd podczas korzystania z przedziału prepareStatement w zapytaniu

PreparedStatement ps = connection.prepareStatement("select sysdate + interval ? day from dual");  
    ps.setString(1, "7"); 
    ps.executeQuery(); 

Będzie to wyjątek, że składnia nie jest dobre, to oczywiście jest, bo ja jestem móc uruchomić to samo zapytanie w sql-developer.

Czy to błąd w wersji PreparedStatement? Czy mogę używać przygotowanych wyciągów razem z interwałem?

+0

Czy nie należy ustawiać "7" jako wartości int? – MadProgrammer

+0

Spróbuj 'interval '7 day''' –

+0

Nie, powinien to być ciąg znaków, składnia oracle dla przedziału to' interval' SOME_NUMBER 'day' –

Odpowiedz

11

Całe wyrażenie INTERVAL '7' DAY jest literałem, nie można po prostu zastąpić jego części zmienną (parametrem). Zamiast tego użyj funkcji NUMTODSINTERVAL(?,'DAY').

0

PreparedStatement nie działa z literałami interwałów, więc ani setInt, ani setString nie działają! http://docs.oracle.com/cd/B19306_01/server.102/b14200/sql_elements003.htm

Z tego powodu, jeśli chcesz dynamicznie zmieniać dni w zapytaniu (z literałami przedziałowymi), jedynym sposobem jest połączenie tej wartości.

W przykładzie:

int yourDays = 7; 
String query ="select sysdate + interval '" + yourDays + "' day from dual "; 

Następnie można użyć PreparedStatement, jeśli trzeba dodać inne parametry i wykonanie zapytania.