2010-11-21 32 views
7

Amigos,Al utilizar Oracle SQL para generar XML anidada

Estoy utilizando Oracle 10g y que necesito para generar los resultados de una tabla utilizando SQL en el siguiente formato 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> 

la regla es muestre el registro seleccionado en la fila externa y los subtítulos deben contener todos los demás registros, excluyendo el que se muestra en la fila externa. No hay jerarquía en los registros.

En el ejemplo anterior, King se selecciona en la fila externa por lo que los subrows deben contener todos los registros de emp excluyendo King.

Esta consulta me da el conjunto de resultados que necesito:

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

Sin embargo, cuando intento generar XML desde esta utilizando la siguiente:

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 

me sale el siguiente error:

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. 

He intentado usar 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 esto genera XML en el formato esperado, no muestra los nombres correctos de los elementos.

Cualquier ayuda para resolver esto sería muy apreciada.

Gracias de antemano

Respuesta

11

Esto no funciona?

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 y la respuesta. Muchas gracias. Desestimé la ruta de la subconsulta de escaladores (¡tontamente sin intentarlo!) Porque pensé que regresaría más una fila, pero ese no es el caso con xmlagg, por supuesto. –

Cuestiones relacionadas