Gerando arquivos XML através de Procedures PL/SQL
A XML (eXtensible Markup Language, ou Linguagem de Marcação Estendida) é muito utilizada para a troca de informações entre sistemas diferentes. Como, por exemplo, posso ter uma aplicação Forms (ou em qualquer outra linguagem de programação como: Delphi, VB, Java...) em que o usuário não tenha acesso ao Banco de Dados, mas precise acessar as informações contidas nele, assim basta eu montar um select acessando a base e montar um arquivo XML com os resultados. Estes dados podem ser acessados por um arquivo em Flash, ou pode ser exibido como uma página Web (mas para isto será necessária a utilização de folhas de estilos (CSS) para que os dados possam aparecer formatados no Browser).
Segue abaixo um exemplo criado com os próprios pacotes do oracle 9i:
[CODE]
create or replace procedure p_geraxml
is
v_file Utl_File.File_Type;
v_xml CLOB;
v_more BOOLEAN := TRUE;
BEGIN
-- cria doc xml a partir da consulta
v_xml := DBMS_XMLQuery.GetXML('select * from emp');
-- gerar saída
v_file := Utl_File.FOpen('DIR_XML', 'test1.xml', 'w');
WHILE v_more LOOP
Utl_File.Put(v_file, Substr(v_xml, 1, 32767));
IF Length(v_xml) > 32767 THEN
v_xml := Substr(v_xml, 32768);
ELSE
v_more := FALSE;
END IF;
END LOOP;
Utl_File.FClose(v_file);
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(Substr(SQLERRM,1,255));
Utl_File.FClose(v_file);
END;
/
[/CODE]
Exemplo de documento XML.
<?xml version="1.0" ?>
<rowset>
<row num="1">
<nome>João da Silva</nome>
<telefone>1</telefone>
<idade>26</idade>
<sexo>23</sexo>
<admissao>10/05/2003</admissao>
</row>
</rowset>
Obs : O exemplo acima só funciona no Oracle 9i, porém existe a possibilidade da isntalação do XDK para 8i, que ainda é um fato a ser estudado, porém segue abaixo outro exemplo criado no Oracle 8i,sem a utilização do XDK, mas que exige um conhecimento básico de XML:
[CODE]
PROCEDURE TESTE_XML IS
CURSOR cEMP IS SELECT * from emp;
DADOS_EMP cEMP%ROWTYPE;
vXML VARCHAR2(32767);
v_file Utl_File.File_Type;
BEGIN
open cEMP;
v_file := Utl_File.FOpen('DIR_XML','test1.xml','w');
vXML:='<?xml version="1.0" encoding="ISO8859-1"?>';
vXML:=vXML||'<DEPARTAMENTO>';
LOOP
FETCH cEMP INTO DADOS_EMP;
EXIT WHEN cEMP%NOTFOUND;
vXML:=vXML||'<EMPREGADO>';
vXML:=vXML||'<NOME>'||DADOS_EMP.NOME||'</NOME>';
vXML:=vXML||'<TELEFONE>'||DADOS_EMP.TELEFONE||'</TELEFONE>';
vXML:=vXML||'<IDADE>'||DADOS_EMP.IDADE||'</IDADE>';
vXML:=vXML||'<SEXO>'||DADOS_EMP.SEXO||' </SEXO>';
vXML:=vXML||' <ADMISSAO>'||DADOS_EMP.ADMISSAO||' </ADMISSAO>';
vXML:=vXML||'</EMPREGADO>';
END LOOP;
close cEMP;
vXML:=vXML||'</DEPARTAMENTO>';
Utl_File.Put(v_file, Substr(vXML, 1, 32767));
Utl_File.FClose(v_file);
END;
[/CODE]
Obs: Para a utilização do UTL_File, ele deve ser declarado no INIT.ORA, o que poderei explicar num próximo artigo.
Até a próxima,
Gisele Nair.