In 11g, probabilmente qualcosa come-
SELECT a.*, LEVEL AS lvl
,XMLQuery( substr( sys_connect_by_path( percent_owned, '*' ), 2 ) RETURNING CONTENT).getnumberval() AS calc
FROM hierarchy_test a
START WITH id = 1
CONNECT BY nocycle PRIOR parent_id = id;
Oppure, secondo il tuo '1'||
trucco-
SELECT a.*, LEVEL AS lvl
, XMLQuery( ('1'|| sys_connect_by_path( percent_owned, '*' )) RETURNING CONTENT).getnumberval() AS calc
FROM hierarchy_test a
START WITH id = 1
CONNECT BY nocycle PRIOR parent_id = id;
Sfortunatamente in 10g, XMLQuery
non può accettare funzioni e si aspetta sempre una stringa letterale per la valutazione, ad esempio-
select XMLQuery('1*0.25' RETURNING CONTENT).getnumberval() as val
from dual;
funziona e restituisce 0.25
, ma
select XMLQuery(substr('*1*0.25',2) RETURNING CONTENT).getnumberval() as val
from dual;
restituisce ORA-19102: XQuery string literal expected
.
La query potrebbe rallentare man mano che il numero di livelli su un albero aumenta con un sovraccarico aggiuntivo della creazione interna dell'albero da parte di XMLQuery
si. Il metodo più ottimale per ottenere il risultato sarebbe comunque una funzione PL/SQL che, tra l'altro, funzionerebbe sia in 10g che in 11g.