Estoy tratando de extraer los datos de XmlType columna "ATTRIBUTE_XML2" tienda como SecureFile BINARIO XML a partir de una base de datos Oracle 12C.
Estoy usando esta consulta de selección en mi código:
select xmlserialize(document a.xmlrecord as clob) as xmlrecord from tablename
ResultSet rset = stmt.executeQuery();
OracleResultSet orset = (OracleResultSet) rset;
while (orset.next()) {
oracle.sql.CLOB xmlrecord = (oracle.sql.CLOB) orset.getClob(1);
Reader reader = new BufferedReader(xmlrecord.getCharacterStream());
}
Aquí " orset.getClob
" está teniendo más memoria en la base de datos Oracle y estamos saliendo de la memoria de procesos en la base de datos Oracle. Actualmente tenemos el almacenamiento de tipo XML como CLOB y el negocio le interesa cambiarlo a XML Binario.
¿Hay alguna opción para recuperar el XML binario desde el conjunto de resultados de Oracle?
Tenga en cuenta que he intentado " orset.getClob
", que da como resultado un error de memoria, ya que está cambiando el código XML binario a CLOB.
También trató con " XMLType xml = (XMLType) orset.getObject(1);
" Esto está muy bien trabajando, pero está tomando 27 minutos para ir a buscar 1 millón de registros XML.
Mientras que el mismo 1 millón completado en 5 minutos si el almacenamiento de tipo de tabla es CLOB en lugar de XML Binario.
¿Hay alguna otra opción para recuperar el XML BINARIO?
La documentación de Oracle para uso de JDBC para acceder a documentos XML en Oracle XML DB establece que:
Puede seleccionar datos usando JDBC XMLType en cualquiera de estas maneras:
- Uso de SQL / XML función
XMLSerialize
en SQL, y obtener el resultado como unaoracle.sql.CLOB
,java.lang.String
ooracle.sql.BLOB
en Java. El fragmento de Java en el Ejemplo 13-2 ilustra esto.- Llamada al método
getObject()
en elPreparedStatement
que obtener toda laXMLType
instancia. El valor de retorno de este método es de tipooracle.xdb.XMLType
. A continuación, puede utilizar las funciones de Java en la claseXMLType
para acceder a los datos. Ejemplo 13-3 muestra cómo hacer esto.
Por lo que debe ser capaz de utilizar XMLSERIALIZE( DOCUMENT your_binary_xml_column AS BLOB )
en SQL y luego utilizar OracleResultSet#getBLOB(int)
para obtener los datos binarios.
Parafraseando Oracle Ejemplo 13-2 para echar a un BLOB
lugar de una CLOB
:
DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver()); Connection conn = DriverManager.getConnection("jdbc:oracle:oci8:@", "QUINE", "CURRY"); OraclePreparedStatement stmt = (OraclePreparedStatement) conn.prepareStatement( "SELECT XMLSerialize(DOCUMENT e.poDoc AS BLOB) poDoc FROM po_xml_tab e"); ResultSet rset = stmt.executeQuery(); OracleResultSet orset = (OracleResultSet) rset; while(orset.next()) { // the first argument is a BLOB oracle.sql.BLOB clb = orset.getBLOB(1); // now use the BLOB inside the program }