2010-11-21 109 views
7

朋友,使用Oracle SQL生成嵌套的XML

我使用Oracle 10g中,我需要使用SQL在下面的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> 

的規則是顯示在外部行中選擇的記錄,並且子行應包含除外部行中顯示的記錄之外的所有其他記錄。記錄沒有層次結構。

在上面的例子中,King在外部行中被選中,因此這些子行應該包含除了King以外的所有記錄。

該查詢給我的結果集,我需要:

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. 

我試過使用DBMS_XMLGEN:

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 

Whist以預期的格式輸出XML,但它沒有顯示正確的元素名稱。

任何幫助解決這個問題將非常感激。

在此先感謝

回答

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和答案。非常感謝。我放棄了Scaler子查詢路由(愚蠢地沒有嘗試它!),因爲我認爲我會返回更多的行,但當然不是這種情況! – 2010-11-21 21:24:23