2015-03-15 12 views
5

Quando si esegue questa query SELECT SYSDATE + INTERVAL '7' DAY FROM DUAL; in un prepareStatement come questoerrore di ottenere quando si utilizza prepareStatement con un intervallo nella query

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

Sarà un'eccezione, che la sintassi non è buona, chiaramente è, perchè sono in grado di eseguire la stessa query in sql-developer.

Si tratta di un bug in PreparedStatement? posso usare le istruzioni preparate insieme all'intervallo?

+0

Non si deve impostare "7" come valore int? – MadProgrammer

+0

Prova 'intervallo '7 giorno'' –

+0

No, dovrebbe essere una stringa, la sintassi di Oracle per intervallo è' intervallo' SOME_NUMBER 'giorno' –

risposta

11

L'intera espressione INTERVAL '7' DAY è letterale, non è possibile semplicemente sostituirne una parte con una variabile (parametro). Utilizzare invece la funzione NUMTODSINTERVAL(?,'DAY').

0

PreparedStatement non funziona con letterali di intervallo, quindi né setInt né setString funzionano! http://docs.oracle.com/cd/B19306_01/server.102/b14200/sql_elements003.htm

Per questo motivo, se si desidera modificare dinamicamente i giorni della query (con valori letterali di intervallo), l'unico modo è concatenare tale valore.

Nel tuo esempio:

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

quindi è possibile utilizzare PreparedStatement se avete bisogno di aggiungere altri parametri e per eseguire la query.

Problemi correlati