Использование 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, за исключением Короля.

Этот запрос дает мне нужный набор результатов:

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 в ожидаемом формате, он не показывает правильные имена элементов.

Мы будем очень признательны за любую помощь в решении этой проблемы.

Заранее спасибо

7
задан Ian Carpenter 21 November 2010 в 19:50
поделиться