PDA

View Full Version : [ORACLE 9 - SQL] Ordinamento bacato ?


Spike79
08-02-2008, 10:37
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:

Spike79
08-02-2008, 12:31
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!

shinya
08-02-2008, 14:17
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.

Spike79
08-02-2008, 14:32
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.

gugoXX
08-02-2008, 22:00
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?

Spike79
08-02-2008, 23:38
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...

Spike79
11-02-2008, 10:09
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:

Spike79
11-02-2008, 14:40
...
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:

gugoXX
11-02-2008, 15:49
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;

Spike79
11-02-2008, 15:58
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 ?

gugoXX
11-02-2008, 16:02
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.

Spike79
12-02-2008, 15:34
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 ?)

gugoXX
12-02-2008, 16:19
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...

Spike79
12-02-2008, 16:46
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 !

gugoXX
12-02-2008, 17:01
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?

Spike79
12-02-2008, 17:09
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.

gugoXX
12-02-2008, 17:35
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?

Spike79
13-02-2008, 08:58
Ciao, scusa del ritardo ma ero uscito dall'ufficio....no, avevo già guardato lì e non ci sono i parametri NLS....

gugoXX
13-02-2008, 09:45
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.