Extraindo um Documento XML a Partir de uma Base Relacional (1)
É muito comum as aplicações recuperarem dados de um banco de dados e transformar os dados recebidos em um arquivo .xml, para vários fins. Neste post, vou mostrar como pular a etapa de a aplicação converter o resultset em um xml, fazendo com que o próprio Oracle retorne o xml desejado.
Seja a tabela COUNTRIES do esquema HR com a seguinte estrutura:
- country_id (char(2) not null)
- country_name (varchar2(40))
- region_id (number)
e com os seguintes dados:
AR Argentina 2
AU Australia 3
BE Belgium 1
BR Brazil 2
CA Canada 2
CH Switzerland 1
CN China 3
DE Germany 1
DK Denmark 1
EG Egypt 4
FR France 1
HK HongKong 3
IL Israel 4
IN India 3
IT Italy 1
JP Japan 3
KW Kuwait 4
MX Mexico 2
NG Nigeria 4
NL Netherlands 1
SG Singapore 3
UK United Kingdom 1
US United States of America 2
ZM Zambia 4
ZW Zimbabwe 4
Vamos extrair um xml simples, que contem simplesmente o conteúdo desta tabela. Observe o comando SQL a seguir:
SELECT XMLElement("Countries",
XMLAttributes(country_id as COD),
XMLForest(country_name as NOME,region_id as REGIAO)
),
extract('/*') as XML
FROM HR.COUNTRIES;
O resultado será:
<Countries><NOME>Argentina</NOME><REGIAO>2</REGIAO></Countries>
<Countries><NOME>Australia</NOME><REGIAO>3</REGIAO></Countries>
<Countries><NOME>Belgium</NOME><REGIAO>1</REGIAO></Countries>
<Countries><NOME>Brazil</NOME><REGIAO>2</REGIAO></Countries>
<Countries><NOME>Canada</NOME><REGIAO>2</REGIAO></Countries>
<Countries><NOME>Switzerland</NOME><REGIAO>1</REGIAO></Countries>
<Countries><NOME>China</NOME><REGIAO>3</REGIAO></Countries>
<Countries><NOME>Germany</NOME><REGIAO>1</REGIAO></Countries>
<Countries><NOME>Denmark</NOME><REGIAO>1</REGIAO></Countries>
<Countries><NOME>Egypt</NOME><REGIAO>4</REGIAO></Countries>
<Countries><NOME>France</NOME><REGIAO>1</REGIAO></Countries>
<Countries><NOME>HongKong</NOME><REGIAO>3</REGIAO></Countries>
<Countries><NOME>Israel</NOME><REGIAO>4</REGIAO></Countries>
<Countries><NOME>India</NOME><REGIAO>3</REGIAO></Countries>
<Countries><NOME>Italy</NOME><REGIAO>1</REGIAO></Countries>
<Countries><NOME>Japan</NOME><REGIAO>3</REGIAO></Countries>
<Countries><NOME>Kuwait</NOME><REGIAO>4</REGIAO></Countries>
<Countries><NOME>Mexico</NOME><REGIAO>2</REGIAO></Countries>
<Countries><NOME>Nigeria</NOME><REGIAO>4</REGIAO></Countries>
<Countries><NOME>Netherlands</NOME><REGIAO>1</REGIAO></Countries>
<Countries><NOME>Singapore</NOME><REGIAO>3</REGIAO></Countries>
<Countries><NOME>United Kingdom</NOME><REGIAO>1</REGIAO></Countries>
<Countries><NOME>United States of America</NOME><REGIAO>2</REGIAO></Countries>
<Countries><NOME>Zambia</NOME><REGIAO>4</REGIAO></Countries>
<Countries><NOME>Zimbabwe</NOME><REGIAO>4</REGIAO></Countries>
É claro que podemos extrair XML mais complexos, a partir da junção de n tabelas, é só variar o comando usado neste exemplo.
Abraços
Parabéns pelo artigo Molina!
Só para acrescentar como sugestão, acredito que uma estrutura mais semanticamente adequada seria:
Argentina2
…
Mais uma vez parabéns!
Desculpe-me, a estrutura que sugeri não saiu corretamente porque as tags foram retiradas.
Argentina2
Parabéns pelo excelente artigo, Molina!
Como sugestão, o xml gerado poderia ter a seguinte estrutura:
Argentina2
Mais uma vez parabéns!