I 11g, förmodligen något liknande-
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;
Eller enligt din '1'||
knep-
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;
Tyvärr i 10g, XMLQuery
kan inte acceptera funktioner och förväntar sig alltid en bokstavlig sträng för utvärdering till exempel-
select XMLQuery('1*0.25' RETURNING CONTENT).getnumberval() as val
from dual;
fungerar och returnerar 0.25
, men
select XMLQuery(substr('*1*0.25',2) RETURNING CONTENT).getnumberval() as val
from dual;
ger ORA-19102: XQuery string literal expected
.
Frågan kan bli långsammare när antalet nivåer i ett träd ökar med en extra overhead av internt trädskapande av XMLQuery
sig. Den mest optimala metoden för att uppnå resultatet skulle fortfarande vara en PL/SQL-funktion som för övrigt skulle fungera både i 10g och 11g.