11जी में, शायद कुछ इस तरह-
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 दोनों में काम करेगा।