W 11g, prawdopodobnie coś w rodzaju-
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;
Lub, zgodnie z Twoim '1'||
sztuczka-
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;
Niestety w 10g, XMLQuery
nie może akceptować funkcji i zawsze oczekuje literału ciągu do oceny, na przykład-
select XMLQuery('1*0.25' RETURNING CONTENT).getnumberval() as val
from dual;
działa i zwraca 0.25
, ale
select XMLQuery(substr('*1*0.25',2) RETURNING CONTENT).getnumberval() as val
from dual;
daje ORA-19102: XQuery string literal expected
.
Zapytanie może działać wolniej wraz ze wzrostem liczby poziomów w drzewie z dodatkowym obciążeniem wewnętrznym tworzeniem drzewa przez XMLQuery
samo. Najbardziej optymalną metodą osiągnięcia tego rezultatu byłaby nadal funkcja PL/SQL, która, nawiasem mówiąc, działałaby zarówno w 10g, jak i 11g.