In 11g, wahrscheinlich so etwas wie-
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;
Oder gemäß Ihrem '1'||
Trick-
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;
Leider in 10g, XMLQuery
kann keine Funktionen akzeptieren und erwartet immer ein String-Literal zur Auswertung, zum Beispiel-
select XMLQuery('1*0.25' RETURNING CONTENT).getnumberval() as val
from dual;
funktioniert und gibt 0.25
zurück , aber
select XMLQuery(substr('*1*0.25',2) RETURNING CONTENT).getnumberval() as val
from dual;
ergibt ORA-19102: XQuery string literal expected
.
Die Abfrage wird möglicherweise langsamer, wenn die Anzahl der Ebenen in einem Baum zunimmt, was zu einem zusätzlichen Overhead der internen Baumerstellung durch XMLQuery
führt selbst. Die optimale Methode, um das Ergebnis zu erzielen, wäre immer noch eine PL/SQL-Funktion, die übrigens sowohl in 10g als auch in 11g funktionieren würde.