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;
SQLフィドル 。
または、'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の両方で機能します。