PDA

View Full Version : [SQL Oracle] Query con uno strano comportamento


sottovento
13-12-2017, 19:43
Il mio cliente ha deciso di scrivere una singola query di circa 1000 linee.
Non so come l'abbiano partorita, ma funziona in una loro applicazione.

Ora, la query deve essere inserita in una nuova applicazione Java. Io sono incaricato di farlo.
Ecco la sorpresa:
- se eseguo la query tramite JDBC, la query fallisce dicendo che non esiste una tabella (credo sia qualcosa di temporaneo creato all'interno della query);
- se la eseguo via SQL Developer va tutto bene;
- se la salvo e la eseguo ancora via SQL Developer, continua ad andar bene;
- se la eseguo via sqlPlus, la query fallisce esattamente come Java, dicendo che non esiste una tabella;
- se la salvo e la eseguo ancora via sqlplus, la query continua a fallire;

Non credo sia necessario pubblicare una query di 1000 linee senza nemmeno avere la possibilita' di sapere la struttura del database.
Credo che prima di tutto la domanda debba essere: com'e' possibile? Perche' l'applicazione del cliente riesce ad eseguirla - cosi' come SQL Developer (che e' scritto in Java, fra l'altro) - e fallisce con Java e con sqlplus?

Non riesco ad immaginarmi una query simile, ma non sono un grande esperto. Penso che il problema sia dovuto alla creazione di tabelle temporanee all'interno della query, ma questo non mi sembra possa giustificare una simile differenza di comportamento....

qualche idea?

sottovento
13-12-2017, 20:33
Scusate, mi rispondo da solo. Ho fatto dei test con sqlplus fino a quando sono riuscito a far eseguire la fat query.
Il problema stava nei settaggi di sqlplus. La fat query ovviamente non e' su una sola riga; inoltre vi erano dei commenti.

Ho eliminato i commenti e impartito questi comandi a sqlplus prima di eseguire la query:

set sqlblanklines on
set sqlterminator ';'

Fatto questo, la query e' stata eseguita correttamente.
Evidentemente il problema erano le linee vuole nella query ed il carattere di terminazione.

Ovviamente ora devo tornare ad affrontare il problema in ambito Java, e mi sa che, viste le premesse, non sara' facilissimo...

sottovento
13-12-2017, 21:25
Ok, questo e' l'ultimo :D
Anche per Java JDBC vale lo stesso problema: non gli piacciono le righe vuote nella query. Anzi, non credo nemmeno che nella query che si passa a jdbc siano ammessi i caratteri di a capo, ma non ne sono sicuro.
Per prova li ho eliminati, sostituendoli con uno spazio per evitare che identificatori a fine ed inizio linea potessero incollarsi ed e' andato tutto!

Ho provato a cercare qualcosa su internet (svogliatamente direi, visto che ho gia' la soluzione) ma non ho trovato questa informazione: quindi, cari colleghi, state attenti a dare in pasto a JDBC una query spezzata su piu' linee

Grazie lo stesso a tutti!

Bazzilla
14-12-2017, 08:35
Grazie lo stesso a tutti!

Grazie a te!

cdimauro
15-12-2017, 05:23
Per me è inconcepibile che non si possano usare quanto meno linee vuote per spezzare query complesse, visto che SQL è un linguaggio abbastanza verboso e comunque non è affatto raro che una query assuma certe dimensioni.

Bah...

Comunque grazie per aver riportato la tua esperienza! :)

sottovento
15-12-2017, 17:11
Hai perfettamente ragione.
Comunque l'importante e' saperlo, cosi' da preprocessare la stringa prima di passarla a jdbc. Strano pero' che la cosa non venga nominata nella documentazione ufficiale (o magari mi e' scappata).

Ovviamente jdbc ha anche altri problemi, per esempio non e' in grado di eseguire degli script sql, ma questo gia' si sapeva.