В 11g, вероятно нещо като-
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;
Или според вашия '1'||
трик-
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;
За съжаление в 10g, XMLQuery
не може да приема функции и винаги очаква низов литерал за оценка, например-
select XMLQuery('1*0.25' RETURNING CONTENT).getnumberval() as val
from dual;
работи и връща 0.25
, но
select XMLQuery(substr('*1*0.25',2) RETURNING CONTENT).getnumberval() as val
from dual;
дава ORA-19102: XQuery string literal expected
.
Заявката може да стане по-бавна, тъй като броят на нивата в дървото се увеличава с допълнителни разходи за вътрешно създаване на дърво от XMLQuery
себе си. Най-оптималният метод за постигане на резултата все пак ще бъде PL/SQL функция, която между другото ще работи както в 10g, така и в 11g.