2010-11-21 85 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