View Full Version : [ORACLE 9 - SQL] Ordinamento bacato ?
Ciao, ho un 'problema' strano con Oracle 9.
Se faccio una select normalissima con:
WHERE Campo_testo >= 'PIPPO'
Mi trovo anche dei valori di Campo_testo in teoria MINORI di "PIPPO" perchè in MINUSCOLO.
Se faccio la WHERE usando "UPPER(Campo_testo)" , tutto va, ma vorrei capire PERCHE' c'è questo 'bug' in Oracle9....con la 8i non lo fa.
astorcas
08-02-2008, 10:51
Ciao, ho un 'problema' strano con Oracle 9.
Se faccio una select normalissima con:
WHERE Campo_testo >= 'PIPPO'
Mi trovo anche dei valori di Campo_testo in teoria MINORI di "PIPPO" perchè in MINUSCOLO.
Se faccio la WHERE usando "UPPER(Campo_testo)" , tutto va, ma vorrei capire PERCHE' c'è questo 'bug' in Oracle9....con la 8i non lo fa.
MMM io credo che più che un bug sia una correzione, le lettere minuscole sono maggiori di quelle maiuscole!
O no? :mbe:
Mi spiego meglio, il collega mi ha dato altre info....
Allora, situazione 'normale':
Select) SELECT con una ORDER BY Colonna
Risultato) Elenco ordinato "A", "a2", "A3", "a4".... giusto
Select) SELECT con una ORDER BY Colonna e WHERE Colonna >= "A"
Risultato) Elenco "a2", "A","A3", ...
Praticamente mette prima la minuscola (e perchè poi ?) e poi le altre.
astorcas
08-02-2008, 13:23
Mi spiego meglio, il collega mi ha dato altre info....
Allora, situazione 'normale':
Select) SELECT con una ORDER BY Colonna
Risultato) Elenco ordinato "A", "a2", "A3", "a4".... giusto
Select) SELECT con una ORDER BY Colonna e WHERE Colonna >= "A"
Risultato) Elenco "a2", "A","A3", ...
Praticamente mette prima la minuscola (e perchè poi ?) e poi le altre.
Di certo non è normale che la clausaola where modifichi l'ordinamento ottenuto con l'order by, dovrebbe solo filtrare... questo comportamento non è normale a prescindere dal fatto che sia a>A o A>a. Boh mi sa che hai bisogno di un parere esperto!
mah, io ho provato a creare una tabella di prova inserendo 'AAAA', 'aaaa', 'BBBB', 'bbbb', ecc... e non mi da risultati strambi (anch'io ho il 9i installato sul portatile al momento).
Fammi un esempio di tabella che la intendi tu con qualche insert e un esempio di select (posta l'sql cosi posso fare le prove in sqlplus).
Sarebbe utile anche l'execution plan che ti salta fuori magari.
Molto strano...sul mio PC funziona, su quello di una collega no.
Usiamo TOAD per fare le select, però lei ha l'Oracle 8i client, io la 9.2 (come quella del DB sul server).
Un esempio ? basta mettere una fila di dati, fare una order by e poi aggiungere una 'Where' sullo stesso campo della order, dicendo chessò " Campo >= 'A' "
Sul PC della collega, sballa tutto.
Molto strano...sul mio PC funziona, su quello di una collega no.
Usiamo TOAD per fare le select, però lei ha l'Oracle 8i client, io la 9.2 (come quella del DB sul server).
Un esempio ? basta mettere una fila di dati, fare una order by e poi aggiungere una 'Where' sullo stesso campo della order, dicendo chessò " Campo >= 'A' "
Sul PC della collega, sballa tutto.
Puoi spiegare cosa significa "E poi aggiungere una Where..."
Cosa sarebbe poi? Dopo la ORDER BY la WHERE non puoi mettercela.
Ma state scrivendo dell'SQL o state lavorando solo con la UI di TOAD?
Puoi spiegare cosa significa "E poi aggiungere una Where..."
Cosa sarebbe poi? Dopo la ORDER BY la WHERE non puoi mettercela.
Ma state scrivendo dell'SQL o state lavorando solo con la UI di TOAD?
No dico, "aggiungere una WHERE" alla select, lo so che non va dopo la ORDER...
Ecco una 'foto' dell'assurdità, questa situazione è sia per un client 8 che per un client 9.1 che si collegano ad un DB 9.1
http://img151.imageshack.us/img151/491/sqlhv7.th.jpg (http://img151.imageshack.us/my.php?image=sqlhv7.jpg)
Notare la posizione di "cdatipers" rispetto a "CSOCIALI" nella select a sinistra e poi nella select a destra.....
^TiGeRShArK^
11-02-2008, 14:33
...
ma usare al posto di:
SELECT con una ORDER BY Colonna e WHERE Colonna >= "A"
SELECT con una ORDER BY Colonna e WHERE Colonna LIKE "A%"
non dovrebbe risolvere il problema? :fagiano:
...
ma usare al posto di:
SELECT con una ORDER BY Colonna e WHERE Colonna >= "A"
SELECT con una ORDER BY Colonna e WHERE Colonna LIKE "A%"
non dovrebbe risolvere il problema? :fagiano:
Beh, e in questo caso, quelli che iniziano con "B" , dove vanno a finire ? Non verrebbero mostrati!
Purtroppo non ho scritto io il programma che genera quella Select, e il collega dice che ha bisogno di un ordinamento secondo un filtro che decide l'utente.
^TiGeRShArK^
11-02-2008, 15:04
Beh, e in questo caso, quelli che iniziano con "B" , dove vanno a finire ? Non verrebbero mostrati!
Purtroppo non ho scritto io il programma che genera quella Select, e il collega dice che ha bisogno di un ordinamento secondo un filtro che decide l'utente.
ah vero..
pensavo dovessi mostrare solo la colonna a dato che avevi mostrato quell'esempio... :p
Cmq non mi pare tanto normale utilizzare un operatore > in una clausola where su un campo testuale :mbe:
Sotto Oracle la comparazione (clausola WHERE) e' pilotata da un operatore diverso da quello di ordinamento (clausola ORDER BY)
Probabilmente non sono settati correttamente in maniera da lavorare allo stesso modo.
E' probabile che l'operatore di comparazione del tuo collega sia case sensitive, mentre quello di ordinamento case insensitive.
Se li volete entrambi insensitive (normalmente si lavora cosi'), provate a cambiare questi due parametri di sessione
alter session set NLS_COMP=LINGUISTIC;
alter session set NLS_SORT=BINARY_CI;
Sotto Oracle la comparazione (clausola WHERE) e' pilotata da un operatore diverso da quello di ordinamento (clausola ORDER BY)
Probabilmente non sono settati correttamente in maniera da lavorare allo stesso modo.
E' probabile che l'operatore di comparazione del tuo collega sia case sensitive, mentre quello di ordinamento case insensitive.
Se li volete entrambi insensitive (normalmente si lavora cosi'), provate a cambiare questi due parametri di sessione
alter session set NLS_COMP=LINGUISTIC;
alter session set NLS_SORT=BINARY_CI;
Uhm , probabilmente è questo il nocciolo della questione....ho trovato questo articolo sui parametri NLS_COMP e NLS_SORT (http://www.dbasupport.com/oracle/ora10g/globalization0301.shtml) però devo usare:
alter session set NLS_COMP=ANSI
Ma visto che la Select viene composta da una serie di primitive Cobol, e il mio collega dice che non può modificarle, esiste un modo per modificare questi parametri "fuori" ? Su DB2 per esempio, come si fa ?
Sono variabili di sessione.
Si cambiano con una istruzione normale.
Sottomettetele dopo aver aperto la connessione verso il DB, oppure ogniqualvolta aprite la connessione verso il DB.
Alternativamente potete forzarle sul server, dall'enterprise manager.
Sono variabili di sessione.
Si cambiano con una istruzione normale.
Sottomettetele dopo aver aperto la connessione verso il DB, oppure ogniqualvolta aprite la connessione verso il DB.
Alternativamente potete forzarle sul server, dall'enterprise manager.
Ok, visto che le chiamate di apertura connessione e selezione non possono modificarle, mi chiedono DOVE forzarle con l'entrerprise manager (ho frugato in lungo e in largo, ma non trovo dove modificare le variabili di avvio....e se lo facessi con TOAD ?)
Da Toad non si puo', o meglio, ci sono i menu DBA, ma non li ho mai guardati.
Certe cose e' meglio farle direttamente con i tool Oracle, soprattutto parametri di istanza.
Inoltre se non sai bene cosa stai facendo rischi di cambiare i parametri solo per la sessione corrente, ma durante la prossima sessione ritornano come settati sul server.
Per sapere come sono messi ora sul server da TOAD puoi leggere la vista di sistema
SELECT * FROM v$parameter;
Non ho l'enterprise manager della 9i sotto mano (nella 10 e nella 11 e' tutto web), ma e' nei parametri di configurazione dell'istanza.
Ma chi e' che ti sta chiedendo come si fanno a modificare? Spero che non siano dei DBA...
Da Toad non si puo', o meglio, ci sono i menu DBA, ma non li ho mai guardati.
Certe cose e' meglio farle direttamente con i tool Oracle, soprattutto parametri di istanza.
Inoltre se non sai bene cosa stai facendo rischi di cambiare i parametri solo per la sessione corrente, ma durante la prossima sessione ritornano come settati sul server.
Per sapere come sono messi ora sul server da TOAD puoi leggere la vista di sistema
SELECT * FROM v$parameter;
Non ho l'enterprise manager della 9i sotto mano (nella 10 e nella 11 e' tutto web), ma e' nei parametri di configurazione dell'istanza.
Ma chi e' che ti sta chiedendo come si fanno a modificare? Spero che non siano dei DBA...
Intanto ti ringrazio per la continua disponibilità....
Chi mi chiede queste cose son dei semplici programmatori come me (loro cobolisti però) e visto che io son quello che 'mastica' un pò più SQL e Oracle, e che magari si sa destreggiare meglio con le guide e le ricerche online, mi chiedono info su ogni stranezza che il DB gli fa.
Avessi sottomano un DBA, lo tartasserei ben bene....:)
Cmq, da TOAD c'è un menu apposito per gli NLS_PARAMETER , ma purtroppo permette solo di visualizzare quelli di Istance e DB, e di mod. solo quelli di Sessione...
Da E.Manager proprio non riesco a venirne a capo...manco nella guida è spiegato dove modificare quel valore !
Comunque sia prima di modificare i parametri a livello di istanza mi accerterei che la soluzione sia quella giusta.
Se provate a cambiare sulla sessione di TOAD della tua collega quei 2 parametri e poi successivamente, sempre nella stessa finestra provate a sottomettere la query, i risultati vengono come vi aspettate?
Comunque sia prima di modificare i parametri a livello di istanza mi accerterei che la soluzione sia quella giusta.
Se provate a cambiare sulla sessione di TOAD della tua collega quei 2 parametri e poi successivamente, sempre nella stessa finestra provate a sottomettere la query, i risultati vengono come vi aspettate?
Perfetti.
Basta mettere ANSI a NLS_COMP.
Se invece lo prova il collega con Oracle 8 su un DB Oracle 8, non serve, va bene anche Binary.
http://www.cs.utah.edu/classes/cs5530-gary/oracle/doc/B10501_01/em.920/a96670/img/instance.gif
Se clicci su "All initialization parameter" li trovi?
Ciao, scusa del ritardo ma ero uscito dall'ufficio....no, avevo già guardato lì e non ci sono i parametri NLS....
Boh.
Provate a cercarli nel file
init.ora
Se li' li trovate, prima di cambiarli fate un backup.
Agendo male sull'init.ora il DB potrebbe non partire piu'.
Dopo aver cambiato l'init.ora dovete restartare l'istanza.
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.