Ammetto di essere di parte quando parlo di database, penso che sia ben chiaro quanto stimo PostgreSQL e la sua filosofia di sviluppo. Diciamo semplicemente che trovo naturale sviluppare con PostgreSQL perche' gli strumenti, i comandi, le librerie, e tutto il resto si comporta come io mi comporterei. Cio' non significa che gli altri database (emergenti e non) siano peggiori, ma a volte ci si scontra con delle cose veramente strane e errori indecifrabili che portano via molto tempo che poteva essere impiegato a fare altro.
Scenario: applicazione Java che effettua delle query SQL tramite i template Spring su database Oracle.
La query da eseguire era molto semplice, ma per renderla ancora piu' semplice la si pensi come:
SELECT surname,name,cdfisc FROM person WHERE cdfisc='?';
Risultato della query? SQLException con "Invalid column index" e il row mapper che non entra nemmeno in funzione. Quindi si tratta di un errore sintattico. Diligentemente apro un tool SQL e digito a mano la stessa query, sostituendo al parametro un valore concreto, e la query diligentemente mi restituisce il risultato cercato. Escluso quindi il caso di query palesemente errata, provo a far eseguire alla applicazione Java una query non parametrica:
SELECT surname,name,cdfisc FROM person ;
ma ancora errore, questa volta per un "invalid character". Rimuovo lo spazio alla fine della query e tutto funziona. Sara' un problema di Spring? Sara' un problema di Oracle? Qualcuno nella catena ha pensato che uno spazio sia un carattere significativo se inserito in fondo alla query!
Comunque un passo avanti e' stato fatto, ora si tratta di riprendere in mano la query parametrica che ancora non funziona, eppure di spazi casuali non ce ne sono. Inutile dire che cdfisc e' un campo stringa, da qui il quoting fra apici semplice. Quasi per caso scopro che proprio quello potrebbe essere il problema, quindi rimuovo il quoting scrivendo la query come:
SELECT surname,name,cdfisc FROM person WHERE cdfisc=?;
e magicamente i dati iniziano a venire fuori dal database!
Inutile dire che la query iniziale eseguita con la stessa configurazione su un server PostgreSQL ha eseguito senza alcun problema.
Scenario: applicazione Java che effettua delle query SQL tramite i template Spring su database Oracle.
La query da eseguire era molto semplice, ma per renderla ancora piu' semplice la si pensi come:
SELECT surname,name,cdfisc FROM person WHERE cdfisc='?';
Risultato della query? SQLException con "Invalid column index" e il row mapper che non entra nemmeno in funzione. Quindi si tratta di un errore sintattico. Diligentemente apro un tool SQL e digito a mano la stessa query, sostituendo al parametro un valore concreto, e la query diligentemente mi restituisce il risultato cercato. Escluso quindi il caso di query palesemente errata, provo a far eseguire alla applicazione Java una query non parametrica:
SELECT surname,name,cdfisc FROM person ;
ma ancora errore, questa volta per un "invalid character". Rimuovo lo spazio alla fine della query e tutto funziona. Sara' un problema di Spring? Sara' un problema di Oracle? Qualcuno nella catena ha pensato che uno spazio sia un carattere significativo se inserito in fondo alla query!
Comunque un passo avanti e' stato fatto, ora si tratta di riprendere in mano la query parametrica che ancora non funziona, eppure di spazi casuali non ce ne sono. Inutile dire che cdfisc e' un campo stringa, da qui il quoting fra apici semplice. Quasi per caso scopro che proprio quello potrebbe essere il problema, quindi rimuovo il quoting scrivendo la query come:
SELECT surname,name,cdfisc FROM person WHERE cdfisc=?;
e magicamente i dati iniziano a venire fuori dal database!
Inutile dire che la query iniziale eseguita con la stessa configurazione su un server PostgreSQL ha eseguito senza alcun problema.
Nessun commento:
Posta un commento