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

правило является покажите запись, выбранную во внешней строке, и подныри должны содержать все остальные записи, за исключением того, что показано во внешней строке. Для записей нет иерархии.

В приведенном выше примере король выбран во внешней строке, поэтому подвиды должны содержать все записи из emp, исключая 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 

Вист, это выводит 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 и ответ. Спасибо. Я отклонил маршрут подзапроса масштабирования (глупо, не пытаясь его!), Потому что я думал, что вернусь еще одну строку, но это не так с xmlagg, конечно! –

Смежные вопросы