Como importar um arquivo XML para o Oracle

Veja aqui a melhor forma de como importar um arquivo xml para o oracle, otimizando sua performance e garantindo bons resultados, sem ter que lê-lo linha a linha.

[ad#texto]

Como importar um arquivo XML para o Oracle? Tenho notado que esta pergunta tem afligido muitos desenvolvedores PL/SQL, até porque estamos falando de um arquivo físico, quer ele esteja em uma pasta local no servidor do banco de dados quer ele esteja disponível via uma URI e este fato pode comprometer a performance da aplicação principalmente com arquivos XML grandes.

Como importar um arquivo XML para o Oracle
Como importar um arquivo XML para o Oracle

Basicamente existem duas formas, uma irá ler o arquivo linha a linha e dependendo da estrutura e endentação do arquivo XML este processo será muito lento e a segunda iremos capturar o arquivo XML direto para um parse XML na memória do Oracle de forma direta e depois iremos transforma-lo em um documento DOM, esta forma é sem dúvidas a mais recomendada.

Agora vamos a parte prática e mostrar exemplos das duas formas de como importar um arquivo XML para o Oracle. O primeiro método é o da leitura linha a linha:

DECLARE
 clobXML   CLOB;
 domXML   dbms_xmldom.DOMDocument;
 arquivo   utl_file.file_type;
 eof      BOOLEAN := FALSE;
 linha     VARCHAR2(32767);

BEGIN
 --Inicializar o CLOB
 DBMS_LOB.createtemporary(clobXML , TRUE , DBMS_LOB.session);
 DBMS_LOB.open(clobXML, DBMS_LOB.LOB_ReadWrite);

 -- Abrir o arquivo para leitura
 arquivo := utl_file.fopen('/minha/pasta/', 'meuXML.xml', 'r');

 -- Loop de leitura linha a linha
 WHILE NOT(eof) LOOP
  BEGIN 
   utl_file.get_line(arquivo, linha);
   DBMS_LOB.writeAppend(vr_clobarq, LENGTH(linha), linha);
  EXCEPTION
   WHEN no_data_found THEN
    eof := TRUE;
  END;
 END LOOP;

 utl_file.fclose(arquivo);
END;

Os mais espertos irão notar que a gravação linha a linha em um CLOB é lenta e que o ideal é fazer um processo de buferização, porém como este não é o foco do post não vou incluir, caso alguém tenha interesse é só perguntar nos comentários que posso mostrar como fazer buferização na gravação do CLOB e com isso melhorar em até 80% o processo de gravação.

Bem simples, mas quando falamos em trabalhar com XML podemos dispensar o processo de leitura linha a linha e com isso facilitar o desenvolvimento e eliminar este processo já que o mesmo pode se tornar lento e depreciar bastante a performance da sua aplicação.

Agora vamos mostrar como adicionar diretamente o arquivo XML para um parse na memória do Oracle e com isso gerar um documento DOM diretamente.

DECLARE
 parse     xmlparser.Parser;
 pasta     varchar2(400) := '/minha/pasta/';
 arqXML   VARCHAR2(400) := 'meuXML.xml';
 arqErro   VARCHAR2(400) := 'arqErr.log';
 docDOM   dbms_xmldom.DOMDocument;

BEGIN
 -- Instanciar o novo parse
 parse := xmlparser.newParser;

 -- Definir as características do parse
 xmlparser.setValidationMode(p, FALSE);
 xmlparser.setErrorLog(parse, pasta || '/' || arqErro);
 xmlparser.setBaseDir(parse, pasta);

 -- Capturar o arquivo para o parse
 xmlparser.parse(parse, pasta || '/' || arqXML);

 -- get document
 docDOM := xmlparser.getDocument(parse);
END;

Bem mais simples e funcional.

Agora você já sabe como importar um arquivo xml para o Oracle.

Petter Rafael

Desenvolvedor Web atua com as tecnologias Java e PHP apoiadas pelos bancos de dados Oracle e MySQL. Além dos ambientes de desenvolvimento acima possuiu amplo conhecimento em servidores Apache/Tomcat, Photoshop, Arte & Foto, Flash e mais uma dezena de ferramentas e tecnologias emergentes. Atualmente colabora com o Viablog escrevendo sobre programação e tecnologia.