En 11g, probablemente algo como-
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;
O, según su '1'||
truco-
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;
Desafortunadamente en 10g, XMLQuery
no puede aceptar funciones y siempre espera una cadena literal para la evaluación, por ejemplo-
select XMLQuery('1*0.25' RETURNING CONTENT).getnumberval() as val
from dual;
funciona y devuelve 0.25
, pero
select XMLQuery(substr('*1*0.25',2) RETURNING CONTENT).getnumberval() as val
from dual;
da ORA-19102: XQuery string literal expected
.
La consulta puede volverse más lenta a medida que aumenta la cantidad de niveles en un árbol con una sobrecarga adicional de la creación interna del árbol por parte de XMLQuery
sí mismo. El método más óptimo para lograr el resultado seguiría siendo una función PL/SQL que, por cierto, funcionaría tanto en 10g como en 11g.