Parser SAX no Oracle com Java
[ad#texto]
Quem já trabalhou com XML no Oracle já deve ter utilizado o XMLType, este cara implementa DOM para fazer o parser e por uma série de motivos não existe uma implementação para parser SAX no PL/SQL, daí esbarramos que em alguns casos ao efetuar o parser o DOM se torna lento, principalmente um arquivo XML grande, como resolver essa situação?
A melhor saída então é criar uma classe Java no próprio bando de dados Oracle e esta classe irá realizar o parser de um CLOB informado e assim resolver os problemas de lentidão deste processo, a classe Java ficaria assim:
create or replace java source
named "Validar" as
import java.sql.*;
import java.io.*;
import java.lang.String;
import oracle.xml.sql.dataset.*;
import oracle.xml.sql.query.*;
import oracle.xml.sql.*;
import oracle.sql.*;
import oracle.jdbc.driver.*;
import oracle.xml.parser.schema.*;
import oracle.xml.parser.v2.*;
import org.xml.sax.*;
import org.w3c.dom.*;
/**
* Classe para implementar parser Sax no Oracle. Devido ao fato do PL/SQL não
* conter nativamente um parser Sax o mesmo foi implementado em Java. Este
* processo é recomendado para a execução de Sax no Oracle via OTN.
*
* @author Petter
* @since Março/2013
* @version 0.5
*/
public class Validar {
public static String validarCLOB(oracle.sql.CLOB xmldoc) {
SAXParser parser = new SAXParser();
try {
parser.parse(new ByteArrayInputStream(xmldoc.getBytes()));
return "1";
} catch (SAXException e) {
return "0 - " + e.getMessage();
} catch (Exception e) {
return "Erro: " + e.getMessage();
}
}
}
Isso irá criar uma classe Java no Oracle que simplesmente irá ser invocada por uma função que irá receber um CLOB que deverá “conter o XML” e irá retornar um VARCHAR2 com o retorno de 1 para caso de sucesso ou informar o erro caso ocorra algum. Veja como ficará a função:
CREATE OR REPLACE FUNCTION validarCLOB(xmldoc CLOB)
return varchar2
AS LANGUAGE JAVA NAME 'Validar.validarCLOB(oracle.sql.CLOB)
returns java.lang.String';
Bem simples, basta então invocar a função e pronto, seu XML irá passar pelo parser SAX.