Newsgroup: it.comp.software.database
Titolo: [ORA 8.1.7] Problema con subquery in SELECT con UNION

Ciao a tutti, 
	avrei bisogno di un vostro parere su come risolvere un grosso problema
che ho con Oracle.
Ho una query fatta in questo modo:
-------------------------------------------
select 
    TO_CHAR(
c.id
) as cbnt_id, 
c.name
 as cbnt_name, 
    TO_CHAR(
d.id
) as dev_id, 
d.name
 as dev_name, 
    TO_CHAR(
p.id
) as port_id, 
p.name
 as port_name
from
    cbnt c, dev d, port p
where
 
c.id
 = d.pid and
 
d.id
 = p.did and
    c.vr = d.vr and
    d.vr = p.vr and
 
p.id
 = any (
        select ats_id from ats
        where not exists (
            select chiave from nodi 
            where chiave = ats_id
        )
    )
-------------------------------------------
Questa funziona benissimo ed è anche molto veloce. La particolarità
importante da tenere in considerazione è il fatto che "
p.id
" e "ats_id"
sono campi di tipo diverso; il primo è un numerico, il secondo è una
stringa, il che, comunque, non da problemi (immagino venga fatto un cast
"implicito").
Ora, se io provo a fare una UNION della medesima query con se stessa,
ossia:
-------------------------------------------
select 
    TO_CHAR(
c.id
) as cbnt_id, 
c.name
 as cbnt_name, 
    TO_CHAR(
d.id
) as dev_id, 
d.name
 as dev_name, 
    TO_CHAR(
p.id
) as port_id, 
p.name
 as port_name
from
    cbnt c, dev d, port p
where
 
c.id
 = d.pid and
 
d.id
 = p.did and
    c.vr = d.vr and
    d.vr = p.vr and
 
p.id
 = any (
        select ats_id from ats /* !!!!!!!!! */
        where not exists (
            select chiave from nodi 
            where chiave = ats_id
        )
    )
UNION
select 
    TO_CHAR(
c.id
) as cbnt_id, 
c.name
 as cbnt_name, 
    TO_CHAR(
d.id
) as dev_id, 
d.name
 as dev_name, 
    TO_CHAR(
p.id
) as port_id, 
p.name
 as port_name
from
    cbnt c, dev d, port p
where
 
c.id
 = d.pid and
 
d.id
 = p.did and
    c.vr = d.vr and
    d.vr = p.vr and
 
p.id
 = any (
        select ats_id from ats
        where not exists (
            select chiave from nodi 
            where chiave = ats_id
        )
    )
-------------------------------------------
...Oracle mi si incazza, dandomi l'errore "ORA-01722: invalid number"
sulla riga evidenziata con /* !!!!!!!!! */.
Immagino che il suddetto "cast implicito" in questo caso vada a farsi
benedire, anche se lo trovo assurdo...
Tant'è che se "casto" 
p.id
 (ossia, "...and to_char(
p.id
) = any...") in
entrambe le query, la UNION funziona ma mi diventa più lenta di un
bradipo zoppo...
Come risolvo questo maledettissimo problema, senza andare ad intaccare
le prestazioni ?????????
Grazie in anticipo.
Paolo.
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 bradipo zoppo...
per quanto riguarda le prestazioni potresti comunque mettere un indice su
to_char() del campo; comunque c'e' qualcosa che non mi torna...
ma tornando al problema principale, se usi to_number() e non si tratta di un
numero valido oracle da' appunto quell'errore.
potresti utilizzare una to_number() personalizzata:
create or replace function tua_to_number
(
str in varchar2
) return number
is
n number;
begin
   begin
       -- un'assegnazione diretta  n := to_number(str) non provoca
l'eccezione
       -- per questo devi fare la select da dual
       select to_number(str) into n from dual;
   exception
       when INVALID_NUMBER then
            n:= -1;
   end;
   return n;
end tua_to_number;
(probabilmente c'e' qualche errore ho scritto al volo)