A consulta abaixo mostra como é simples usar essa extensão:
SELECT *
FROM XMLTABLE ('ROWSET/ROW/*' PASSING
     DBMS_XMLGEN.GETXMLTYPE('select 17,25,39 from dual') 
     COLUMNS val VARCHAR2(8) PATH '.'
) X
 17   25   39  
A rotina DBMS_XMLGEN.GETXMLTYPE recebe uma consulta e retorna um XML com a seguinte forma:
<ROWSET>
 <ROW>
  <_x0031_7>17</_x0031_7>
  <_x0032_5>25</_x0032_5>
  <_x0033_9>39</_x0033_9>
 </ROW>
</ROWSET>
Com XMLTABLE, realiza-se o caminho inverso. A expressão 'ROWSET/ROW/*' nos indica que queremos todos os nodos filhos de nodos do tipo ROW. Depois da chamada a DBMS_XMLGEN.GETXMLTYPE há uma descrição dos tipos para os quais as colunas devem ser convertidas.
O primeiro select retornava linhas de apenas uma coluna. Para extrair o nome de cada coluna, é preciso fazer o seguinte:
SELECT x.column_value.getrootelement(), x.column_value.extract('//./text()')
FROM XMLTABLE ('ROWSET/ROW/*' PASSING
     DBMS_XMLGEN.GETXMLTYPE('select 17 as A,25 as B,39 as C from dual')
) X
 A   17   B   25   C   39  
Essa consulta funciona no Oracle 10g. O DB2 e o Oracle 11g tem suporte melhor para o XPath e, portanto, permitem maiores estrepolias.
 
 

Interessante, sendo SQL standard deve ser portável, correto?
ResponderExcluirEspecificamente no SQL Server 2005 ou posterior vc tem a opcçao do operador UNPIVOT:
http://blogs.msdn.com/b/craigfr/archive/2007/07/17/the-unpivot-operator.aspx
http://msdn.microsoft.com/en-us/library/ms177410.aspx
Funciona pelo menos no Oracle e no DB2. Esse paper tem uma comparação dos suportes: http://era.teipir.gr/era2/fullpap/B22.pdf
ResponderExcluir