V 11g, pravděpodobně něco jako-
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;
Nebo podle vašeho '1'||
trik-
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;
Bohužel v 10g, XMLQuery
nemůže přijímat funkce a vždy očekává řetězcový literál pro vyhodnocení například-
select XMLQuery('1*0.25' RETURNING CONTENT).getnumberval() as val
from dual;
funguje a vrací 0.25
, ale
select XMLQuery(substr('*1*0.25',2) RETURNING CONTENT).getnumberval() as val
from dual;
dává ORA-19102: XQuery string literal expected
.
Dotaz se může zpomalit, protože se zvyšuje počet úrovní ve stromu s další režií na vytváření interního stromu pomocí XMLQuery
sám. Nejoptimálnější metodou k dosažení výsledku by stále byla funkce PL/SQL, která by mimochodem fungovala jak v 10g, tak 11g.