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.