Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

अपने माता-पिता के स्वामित्व वाले मूल के प्रतिशत की गणना करें

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;

SQL Fiddle

या, आपके '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 दोनों में काम करेगा।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. इसके कारण:java.sql.SQLException:ORA-01795:किसी सूची में अभिव्यक्तियों की अधिकतम संख्या 1000 है?

  2. SQL क्वेरी Oracle में एकाधिक पंक्तियों से स्तंभ मानों को संयोजित करने के लिए

  3. Oracle में दिनांक स्वरूप 'yyyy/mm/dd' को 'mm-dd-yyyy' में बदलें

  4. पहले कुछ या सबसे अधिक अवलोकन खोजने पर TOP या रैंक का उपयोग करें

  5. Oracle फ़ंक्शन उदाहरण दो तिथियों के बीच दिनों की संख्या प्राप्त करने के लिए