Em 11g, provavelmente 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;
SQL Fiddle .
Ou, conforme seu
'1'||
truque- 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;
Infelizmente em 10g,
XMLQuery
não pode aceitar funções e sempre espera uma string literal para avaliação, por exemplo- select XMLQuery('1*0.25' RETURNING CONTENT).getnumberval() as val
from dual;
funciona e retorna
0.25
, mas select XMLQuery(substr('*1*0.25',2) RETURNING CONTENT).getnumberval() as val
from dual;
fornece
ORA-19102: XQuery string literal expected
. A consulta pode ficar mais lenta à medida que o número de níveis em uma árvore aumenta com uma sobrecarga adicional de criação de árvore interna por
XMLQuery
em si. O método mais ideal para alcançar o resultado ainda seria uma função PL/SQL que, por sinal, funcionaria tanto em 10g quanto em 11g.