Ultimamente mi sono imbattuto in un problema interessante legato ai driver Oracle: una funzione rilasciata non funzionava nel nuovo ambiente e dava l’eccezione BadSqlGrammarException e più precisamente .
1 |
org.springframework.jdbc.BadSqlGrammarException: CallableStatementCallback; bad SQL grammar [{? = call GETREPORTGENERALE(?, ?, ?, ?)}]; |
Comincio l’analisi del problema e la segnalazione fa pensare che l’applicativo stia invocando in modo errato la function, che effettivamente in ingresso riceve 5 parametri e non 4 come fa vedere il log. Rigenero il war pensando che sia stata installata una versione diversa ma il problema persiste. A questo punto penso che il problema possa essere lato db, pertanto rigenero gli script sql e vengono reinstallati nell’ambiente di riferimento. Niente da fare. Mi accorgo che la versione Oracle tra i 2 ambienti è differente, ma questo non dovrebbe spiegare l’errore. Non mi resta che controllare i 2 ambienti, in questo caso un tomcat 7 e mi accordo che i 2 ambienti presentano versioni di driver oracle differenti. Il cliente aveva effettuato l’aggiornamento della versione Oracle alla 12 e di conseguenza aveva aggiornato la versione del driver Oracle, passando dalla 10 alla 12. Ecco individuato il problema, la chiamata falliva se fatta con il nuovo driver. La chiamata sfrutta la classe SimpleJdbcCall offerta da Spring
1 2 3 |
SimpleJdbcCall jdbcCall = new SimpleJdbcCall(getJdbcTemplate()). withFunctionName("getReportGenerale"). returningResultSet("reportGenerali", new ReportMapper()); |
Per risolvere il problema ho dovuto modificare il sorgente, rinunciare alla SimpleJdbcCall e utilizzare la classica CallableStatement
1 2 |
CallableStatement prepareCall = getConnection().prepareCall(getReportGenerale); prepareCall.registerOutParameter(1,OracleTypes.CURSOR); |