2010-11-21 14 views
7

दोस्त उत्पन्न करने के लिए,Oracle SQL का उपयोग नेस्टेड एक्सएमएल

मैं Oracle 10g उपयोग कर रहा हूँ और मैं निम्नलिखित XML स्वरूप में एसक्यूएल का उपयोग कर एक टेबल से परिणाम उत्पन्न करने की जरूरत है:

<RESULTS> 
    <ROW> 
     <EMPNO>7839</EMPNO> 
     <ENAME>KING</EMPNO> 
     <SUBROWS> 
      <ROW> 
       <EMPNO>7369</EMPNO> 
       <ENAME>SMITH</EMPNO> 
       ... Rest of the EMP table records 
       excluding KING 
      </ROW> 
     </SUBROWS> 
    </ROW> 
</RESULTS> 

शासन करने के लिए है बाहरी पंक्ति में चयनित रिकॉर्ड दिखाएं और उपरोक्त में बाहरी पंक्ति में दिखाए गए सभी को छोड़कर सभी अन्य रिकॉर्ड होना चाहिए। रिकॉर्ड के लिए कोई पदानुक्रम नहीं है।

ऊपर दिए गए उदाहरण में राजा को बाहरी पंक्ति में चुना जाता है ताकि उपरोक्त राजा को छोड़कर एमएम से सभी रिकॉर्ड हो।

इस क्वेरी मुझे परिणाम सेट देता है मैं की जरूरत है:

select e.empno, 
     e.ename, 
     cursor(select empno, 
        ename 
       from emp where empno <> 7839) 
from emp e 
where empno = 7839 

लेकिन जब मैं का उपयोग कर इस से XML जनरेट करने का प्रयास करें:

select xmlelement("RESULTS", 
      xmlagg(xmlelement("ROW", 
         xmlelement("EMPNO", empno), 
         xmlelement("ENAME", ename), 
          cursor(SELECT xmlagg(xmlelement("SUBROWS", xmlelement("ROW", 
                xmlelement("EMPNO", empno), 
                xmlelement("ENAME", ename) 
                       ) 
                  ) 
               ) 
            FROM emp 
            WHERE empno <> 7839 
           )        
          ) 

       ) 
       )     
from emp 
where empno = 7839 

मैं निम्न त्रुटि:

ORA-22902: CURSOR expression not allowed 
22902. 00000 - "CURSOR expression not allowed" 
*Cause: CURSOR on a subquery is allowed only in the top-level 
      SELECT list of a query. 

मैंने डीबीएमएस_एक्सएमएलजीएन का उपयोग करने की कोशिश की है:

SELECT DBMS_XMLGEN.getXML('select empno, 
            ename, 
            cursor(select empno, 
               ename 
             from emp 
             where empno <> 7839) as SUBROWS 
          from emp 
          where empno = 7839') 
FROM dual 

यह एक्सएमएल अपेक्षित प्रारूप में एक्सएमएल आउटपुट करता है जो सही तत्व नाम नहीं दिखाता है।

इसे हल करने में कोई भी मदद की बहुत सराहना की जाएगी।

अग्रिम धन्यवाद

उत्तर

11

यह काम नहीं करता है?

select xmlelement("RESULTS", 
     xmlagg(xmlelement("ROW", 
        xmlelement("EMPNO", empno), 
        xmlelement("ENAME", ename), 
         (SELECT xmlagg(xmlelement("SUBROWS", xmlelement("ROW", 
               xmlelement("EMPNO", empno), 
               xmlelement("ENAME", ename) 
                      ) 
                 ) 
              ) 
           FROM emp 
           WHERE empno <> 7839 
          )        
         ) 

      ) 
      )     
from emp 
where empno = 7839 
+1

+1 और उत्तर। बहुत बहुत धन्यवाद। मैंने स्केलर सबक्वायरी रूट को खारिज कर दिया (बेवकूफ इसे कोशिश किए बिना!) क्योंकि मैंने सोचा था कि मैं एक और पंक्ति लौट रहा हूं लेकिन यह निश्चित रूप से xmlagg के मामले में नहीं है! –

संबंधित मुद्दे