À l'aide de Oracle SQL pour générer du XML imbriquée

Amis,

Je suis en utilisant Oracle 10g et j'ai besoin de générer les résultats à partir d'un tableau à l'aide de SQL dans le format xml suivant:

<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>

La règle est de montrer l'enregistrement sélectionné dans la ligne externe et la subrows doit contenir tous les autres dossiers à l'exclusion de celui indiqué dans la rangée externe. Il n'y a pas de hiérarchie de dossiers.

Dans l'exemple ci-dessus le Roi est sélectionné dans la rangée externe de sorte que le subrows doit contenir tous les enregistrements à partir de l'emp à l'exclusion de Roi.

Cette requête me donne l'ensemble des résultats dont j'ai besoin:

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

Cependant lorsque j'essaie de générer un document XML à partir de ce qui suit:

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

J'obtiens l'erreur suivante:

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.

J'ai essayé d'utiliser 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 ce sorties XML dans le format attendu qu'il est ne montre pas le bon élément noms.

Toute aide dans la résolution de ce serait très apprécié.

Merci d'avance

OriginalL'auteur Ian Carpenter | 2010-11-21