Diferencia entre revisiones de «CLOB de Oracle en Weblogic»

De Dos Ideas.
Saltar a: navegación, buscar
(Ver también)
 
(No se muestran 7 ediciones intermedias de 2 usuarios)
Línea 1: Línea 1:
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:
+
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:  
  
<code java5>import java.io.IOException;
+
<code java5="java5">import java.io.IOException;
 
import java.io.Writer;
 
import java.io.Writer;
 
import java.sql.Clob;
 
import java.sql.Clob;
Línea 45: Línea 45:
 
 
 
return writerDelClob;
 
return writerDelClob;
 +
    }
 +
</code>
 +
 +
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:<br>
 +
 +
<code java>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 &lt; 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&nbsp;!= 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);
 +
                }
 +
            }
 +
        }
 
     }
 
     }
 
</code>
 
</code>
  
== Ver también ==
+
<code java>import java.io.IOException;
* [[Oracle]]
+
import java.io.OutputStream;
* [[JDBC]]
+
import java.sql.Clob;
* [[CLOB de Oracle]]
+
import java.sql.ResultSet;
* [http://www.oracle.com/technology/docs/tech/java/sqlj_jdbc/doc_library/javadoc/oracle.sql.CLOB.html Javadoc CLOB]
+
import java.sql.SQLException;
*[http://download.oracle.com/docs/cd/E13222_01/wls/docs91/jdbc/thirdparty.html#1045809 Using Third-Party Drivers with WebLogic Server]
+
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&nbsp;!= 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);
 +
          }
 +
      }
 +
  }
 +
}
 +
</code>
 +
 
 +
== Ver también ==
 +
*[[Oracle]]  
 +
*[[JDBC]]  
 +
*[[CLOB de Oracle]]  
 +
*[http://www.oracle.com/technology/docs/tech/java/sqlj_jdbc/doc_library/javadoc/oracle.sql.CLOB.html Javadoc CLOB]  
 +
*[http://download.oracle.com/docs/cd/E13222_01/wls/docs91/jdbc/thirdparty.html#1045809 Using Third-Party Drivers with WebLogic Server]
 +
*[http://java.sun.com/j2se/1.5.0/docs/guide/jdbc/clob.html Java Sun Clob Guide]
  
[[Category:Oracle]]
+
[[Category:Oracle]] [[Category:WebLogic]] [[Category:Java]]
[[Category:WebLogic]]
 
[[Category:Java]]
 

Revisión actual del 18:00 19 oct 2009

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);
         }
     }
 }

}

Ver también