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