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