CLOB de Oracle en Weblogic
Si tenemos una aplicación Java corriendo en WebLogic la forma de acceder a un CLOB de Oracle para escritura se maneja de una forma especial. en nuestro caso utilizamos JDBC y por consiguiente la clase weblogic.jdbc.vendor.oracle.OracleThinClob. Aqui dejamos un ejemplo:
import java.io.IOException;
import java.io.Writer;
import java.sql.Clob;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.springframework.dao.DataAccessResourceFailureException; import org.springframework.jdbc.core.RowMapper; import org.springframework.jdbc.core.support.JdbcDaoSupport;
import weblogic.jdbc.vendor.oracle.OracleThinClob;
import com.dosideas.dao.UnDao;
public class UnDaoImpl extends JdbcDaoSupport implements UnDao {
/** * Query que busca el Clob por id. * SELECT ARCHIVO FROM TABLA_CON_ARCHIVO WHERE ID = ? FOR UPDATE; */ private String query;
/** * Obtiene el writer del Clob. */ public Writer obtenerWriter(Long id) { Clob clobReporte = (Clob) getJdbcTemplate() .queryForObject(getQuery(), new Object[] {idPeticion }, new RowMapper() {
public Object mapRow(ResultSet resultSet, int rowNum)
throws SQLException {
return (Clob) resultSet.getClob(1);
} }); Writer writerDelClob = null; try { writerDelClob = ((OracleThinClob) clobReporte).getCharacterOutputStream(); } catch (SQLException e) { // Tratar el error }
return writerDelClob;
}
Para realizar la Lectura de un CLOB de Oracle, usamos tambien JDBC, y como la clase weblogic.jdbc.vendor.oracle.OracleThinClob implementa la interfaz java.sql.Clob, utilizamos los metodos de esta ultima para obtener el contenido del CLOB. La funcion getSubString nos permite obtener desde la posicion del caracter que le indiquemos, una catidad determinada e caracteres. Con el metodo length, obtenemos el tamaño del CLOB, con lo cual podemos obtener todo el contenido, o recuperarlo por una cantidad fija de caracteres, asi como lo vemos en los siguientes ejemplos:
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.sql.Clob;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.springframework.dao.DataAccessResourceFailureException;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.support.JdbcDaoSupport;
import com.tm.sera.dao.ClobReaderDao;
public class ClobReaderDaoImpl extends JdbcDaoSupport implements ClobReaderDao {
/** * Query que busca el Clob por id. Por ejemplo: * SELECT ARCHIVO FROM TABLA_CON_ARCHIVO WHERE ID = ? */ private String query;
/** * tamano del buffer de lectura del CLOB. Dependiendo de su tamano, la * cantidad de fetch que se realizan. */ public int tamanoBuffer;
public void leerYExportarClobexportar(OutputStream writerServlet, Long id) {
Clob clobReporte = (Clob) getJdbcTemplate().queryForObject(getQuery(), new Object[] {id}, new RowMapper() { public Object mapRow(ResultSet resultSet, int rowNum) throws SQLException { return (Clob) resultSet.getClob(1); } });
OutputStreamWriter osWriter = null;
try { // Para escribir mas facil crea un buffer para escritura. osWriter = new OutputStreamWriter(writerServlet);
long tamano = clob.length(); long posDesde = 1; while (desde + tamanoBuffer < tamanoClob) { osWriter.write(clob.getSubString(posDesde, tamanoBuffer)); posDesde += tamanoBuffer; }
osWriter.write(clob.getSubString(posicionDesde, new Long(tamano - posDesde + 1).intValue()));
} catch (SQLException e) { String mensaje = "Ocurrio un error al buscar CLOB por ID:[" + id + "]"; throw new DataAccessResourceFailureException(mensaje, e);
} catch (IOException e) { String mensaje = "Ocurrio un error al acceder al CLOB por ID:[" + id + "]"; throw new DataAccessResourceFailureException(mensaje, e);
} finally { if (osWriter != null) { try { osWriter.close(); } catch (IOException e) { String mensaje = "Ocurrio un error al cerrar la conexion para lectura del CLOB "; throw new DataAccessResourceFailureException(mensaje, e); } } } }
import java.io.IOException;
import java.io.OutputStream;
import java.sql.Clob;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.springframework.dao.DataAccessResourceFailureException;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.support.JdbcDaoSupport;
import com.tm.sera.dao.ClobReaderDao;
public class ClobReaderDaoImpl extends JdbcDaoSupport implements ClobReaderDao {
/**
* Query que busca el Clob por id. Por ejemplo: * SELECT ARCHIVO FROM TABLA_CON_ARCHIVO WHERE ID = ?; */
private String query;
public void leerClob(Long id) {
Clob clobReporte = (Clob) getJdbcTemplate().queryForObject(getQuery(), new Object[] {id }, new RowMapper() { public Object mapRow(ResultSet resultSet, int rowNum) throws SQLException { return (Clob) resultSet.getClob(1); } });
String contenidoClob = null; try { long tamanoClob = clob.length(); contenidoClob = clob.getSubString(1, tamanoClob); System.out.println(contenidoClob); } catch (SQLException e) { String mensaje = "Ocurrio un error al buscar CLOB por ID:[" + id + "]"; throw new DataAccessResourceFailureException(mensaje, e); } catch (IOException e) { String mensaje = "Ocurrio un error al acceder al CLOB por ID:[" + id + "]"; throw new DataAccessResourceFailureException(mensaje, e); } finally { if (osWriter != null) { try { osWriter.close(); } catch (IOException e) { String mensaje = "Ocurrio un error al cerrar la conexion para lectura del CLOB"; throw new DataAccessResourceFailureException(mensaje, e); } } }
}