Salve.
Ho un problema strano sul lancio di procedure pl/sql da una classe java. Il metodo che uso funziona perchè l'avrò usato altre 100 volte senza nessuna complicazione. In questo particolare caso però mi da un errore.
Ma andiamo con ordine. Dunque, io mi creo la mia bella stringa sulla base delle selezioni fatte dall'utente a video, ed ottengo qualcosa di simile a questa:
codice:
begin package.procedure('2', 'N'); end;
Ora, se io prendo questa stringa (che mi faccio anche scrivere sui log) e la lancio da sqlplus, va tutto bene ed arriva al fondo senza nessun errore.
La mia classe java apre una connessione e sottomette la stringa (ripeto, metodo usato altre volte) ma questa si blocca a causa di un errore di conversione numerica (ORA-01722: Invalid number). Subito ho pensato che il problema fosse il primo parametro, quel 2 passato tra apici, e invece non è così. Andando a commentare un po' di codice qua e là, ho scoperto dov'è che si blocca: la procedura legge i dati da un file di testo e li va a scrivere su una tabella. Siccome legge anche un importo che ci arriva con il punto come separatore di decimali, noi lo andiamo a sostituire con la virgola e ne facciamo la to_number (se non facessimo questa conversione, lanciandola da sqlplus va in errore).
La cosa che mi lascia perplesso è che non va in errore java, ma quella stessa procedura pl/sql che lanciata a mano funziona liscia come l'olio!
A questo punto la mia domanda è: perchè ci sono comportamenti diversi sul db a seconda di chi lancia la procedura? C'è da impostare qualcosa nell'interfaccia tra java e oracle che per queste particolari situazioni è indispensabile?
Se può servire, ecco il metodo java che utilizzo:
codice:
public int executeNonQuery(String sqlString) throws Exception {
Connection conn = DbConnection.getConnection();
Statement st = null;
int numRec;
try {
st = conn.createStatement();
numRec = st.executeUpdate(sqlString);
st.close();
return numRec;
}
finally {
try {
if (st != null) {
st.close();
}
}
catch(Exception ex) {
//ignora eventuali errori
}
DbConnection.freeConnection(conn);
}
}