InicioArticulos y noticiasBases de datosProgramaciónForosInternetServiciosContratacionEmail
También puedes ver ...
Oracle compra Sun Microsystems
Excepciones personalizadas en PL/SQL
Como conectar a ORACLE con Java
Trabajar con datos de tipo BLOB en ORACLE
PL/SQL y Java
Secuencias
Transacciones autónomas
SQL Dinamico
Funciones integradas de PL/SQL
Transacciones con PL/SQL

Afiliados
La Web del programador
MundoProgramacion


Recuperar BLOB de ORACLE

    En uno de los articulos anteriores hablamos de como guardar un archivo (imagen, sonido, video ... ) en un base de datos ORACLE con PL SQL y los datos binarios, BLOB. Entonces prometimos explicar como recuperar y utlizar estos datos en una aplicación cliente.

    Como lo prometido es deuda ... aquí esta el articulo. Hemos seleccionado Java como lenguaje para desarrollar nuestra aplicación cliente. Como requisito previo debemos conocer el lenguaje de programación Java.

    Para la realización de este programa vamos a usar los siguientes packages:

  • java.io
  • java.sql
  • oracle.jdbc.driver

    Debido a que necesitamos el paquete de oracle.jdbc.driver vamos a necesitar incluir la librería classes12.jar  al ClassPath.

    El programa que vamos a realizar formará parte del package Devjoker.Oracle.Blob. Está compuesto de las siguientes clases:

  • GestorDeConexiones
  • RecuperadorBLOB
  • Main

    Las sentencias import que vamos a necesitar son las siguientes:


package Devjoker.Oracle.Blob;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.IOException;
import java.io.File;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.ResultSet;
import java.sql.Blob;
import oracle.jdbc.driver.OracleConnection;
import oracle.jdbc.driver.OracleDriver;

    La primera clase que vamos a comentar es la clase GestorDeConexiones , encargada de establecer y gestionar las conexiones con ORACLE. Esta clase realiza las siguientes tareas:

  • El constructor GestorDeConexiones, que recibe el nombre de usuario de la base de datos y su clave de acceso.
  • conectar, método privado encargado de realizar la conexión.
  • closeConnection, cierra la conexion
  • getConnection, devuelve una referencia a la conexión abierta.

    El código de la clase GestorDeConexiones se muestra a continuación.La conexion se realiza a través del driver oci por lo que será necesario que tengamos instalado el cliente de Oracle. Si no disponemos del driver de Oracle podemos usar el driver thin. En todo caso la información de la url de conexión dependerá de nuestra configuración


class GestorDeConexiones
{
    private String user;
    private String password;
    private Connection conn = null;
    private boolean conectado = false;

    public  GestorDeConexiones(String usr, String pwd){
        user = usr;
        password = pwd;
    }

    public void closeConnection() throws SQLException{
        if (conectado)
            conn.close();
    }
   
    private void conectar() throws SQLException   {
       
        String url;

        DriverManager.registerDriver(new OracleDriver());
              
       // url = "jdbc:oracle:oci:@<TNS_NAME>";
       // url = "jdbc:oracle:thin:@<server>:<port=1521>:<SID>";

        url = "jdbc:oracle:oci:@ORACLEBD";
        conn = DriverManager.getConnection(url,user, password);
        System.out.println("Conexion correcta");
        conectado = true;
       
    }
   
    public Connection getConnection() throws SQLException
    {
        if (!conectado)
            conectar();
        return conn;
    }       

    La clase que realmente realiza el trabajo del programa es RecuperadorBLOB, que ejecuta una consulta a la base de datos y vuelca al sistema de archivos cliente el contenido de nuestro campo BLOB. El metodo RecuperarBLOB es estático por lo que no necesitaremos instanciar la clase, tan solo indicar el id del BLOB en la tabla y la ruta donde queramos guardar el resultado.

    Todo el trabajo se realiza en el método estático RecuperarBLOB, que ejecuta una consulta a la tabla "archivos" (creada y cargada en el artículo anterior), y con el resultado de la consulta guarda los datos en el sistema de archivos.

    La forma de ejecutar la consulta es la clásica de jdbc, es decir, construir la sql, crear un Statement y ejecutarlo para conseguir el ResultSet. Lo único que varia es almacenaremos el contenido del campo en una variable de tipo Blob (java.sql.Blob), y que con ella obtendremos el InputStream a través del método getBinaryStream(). A partir de ahí usaremos un FileOutputStream para guardar el archivo.

Nota:Cualquier archivo puede representarse como un array de bytes. Por esos usamos la variable byte buffer[].

    El código de la clase RecuperadorBLOB se muesta a continuación.


class RecuperadorBLOB
{
    public static void RecuperarBLOB
(Connection cn,  String idBLOB, String path)
    throws SQLException, IOException
    {
        FileOutputStream fos = null;
        Statement st = null;
        ResultSet rs = null;
        String sql ="select CO_ARCHIVO, " +
                    "       NOMBRE_ARCHIVO, " +
                    "       BIN, " +
                    "       FX_ALTA " +
                    "from archivos " +
                    "WHERE CO_ARCHIVO = '" + idBLOB + "' ";
     
        try{
            st = cn.createStatement();       
            rs = st.executeQuery(sql);
            if (rs.next())
            {               
                String pathname=
path + "\\" + rs.getString("NOMBRE_ARCHIVO") ;
                File file = new File(pathname);
                fos = new FileOutputStream(file);                   
                Blob bin = rs.getBlob("BIN");
                InputStream inStream = bin.getBinaryStream();
                int size = (int)bin.length();
                byte[] buffer = new byte[size];
                int length = -1;
                while ((length = inStream.read(buffer)) != -1)
                {
                  fos.write(buffer, 0, length);               
                }                                       
            }
        }
        catch (IOException ioe)
        {
            throw new IOException(ioe.getMessage());
        }
        finally
        {
            if (fos != null)
                fos.close();
            if (rs != null)
                rs.close();
            rs = null;
            st = null;       
        }       
    }
}

    Bien, pues con esto únicamente nos falta la clase Main, el punto de entrada del programa. Esta clase realiza las siguiente tareas:

  • Crea una instancia de GestorDeConexiones, y establece una conexion con nuestro servidor ORACLE.
  • Llama al método estático RecuperarBLOB de la clase RecuperadorBLOB, por tres veces (los tres archivos que, en mi caso, tengo guardos en la base de datos.
  • Cierra la conexion con la base de datos con el GestorDeConexiones.


public class Main {      
    public static void main(String[] args) {               
        System.out.println("Inicializando programa ...");
        Connection conn = null;
        GestorDeConexiones gc = null;
        try{
            gc = new GestorDeConexiones("app1", "password");
            conn = gc.getConnection();           
            String path = "c:\\javaout";
            RecuperadorBLOB.RecuperarBLOB(conn,"000001",path);
            RecuperadorBLOB.RecuperarBLOB(conn,"000002",path);
            RecuperadorBLOB.RecuperarBLOB(conn,"000003",path);                                           
        }
        catch (SQLException sqle) {
            System.out.println
("Error de acceso a BD:" + sqle.getMessage());
            sqle.printStackTrace();
        }
        catch (IOException ioe){
            System.out.println
("Error de acceso a disco:" + ioe.getMessage());
            ioe.printStackTrace();
        }
       
        try{
            if (gc != null && conn != null)
            gc.closeConnection();
        }
        catch (SQLException sqle)
        {
            System.out.println
("Error de acceso a BD:" + sqle.getMessage());
            sqle.printStackTrace();
            conn = null;
            gc = null;
        }
        System.out.println("Finalizando programa ...");
    }   
}

    Como habeis podido ver el código es bastante fácil, y el resultado ... bueno el resultado es este:


[Ampliar Imagen]

    El código completo es el que sigue a continuación:


/*
 * Main.java
 *
 * Created on 11 de septiembre de 2006, 23:33
 *

 */
package Devjoker.Oracle.Blob;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.IOException;
import java.io.File;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.ResultSet;
import java.sql.Blob;
import oracle.jdbc.driver.OracleConnection;
import oracle.jdbc.driver.OracleDriver;
/**
 *
 * @author devjoker
 */
public class Main {       
    public static void main(String[] args) {               
        System.out.println("Inicializando programa ...");
        Connection conn = null;
        GestorDeConexiones gc = null;
        try{
            gc = new GestorDeConexiones("app1", "password");
            conn = gc.getConnection();           
            String path = "c:\\javaout";
            RecuperadorBLOB.RecuperarBLOB(conn,"000001",path);
            RecuperadorBLOB.RecuperarBLOB(conn,"000002",path);
            RecuperadorBLOB.RecuperarBLOB(conn,"000003",path);                                           
        }
        catch (SQLException sqle) {
            System.out.println
("Error de acceso a BD:" + sqle.getMessage());
            sqle.printStackTrace();
        }
        catch (IOException ioe){
            System.out.println
("Error de acceso a disco:" + ioe.getMessage());
            ioe.printStackTrace();
        }
       
        try{
            if (gc != null && conn != null)
            gc.closeConnection();
        }
        catch (SQLException sqle)
        {
            System.out.println
("Error de acceso a BD:" + sqle.getMessage());
            sqle.printStackTrace();
            conn = null;
            gc = null;
        }
        System.out.println("Finalizando programa ...");
    }   
}
class RecuperadorBLOB
{
    public static void RecuperarBLOB
(Connection cn,  String idBLOB, String path)
    throws SQLException, IOException
    {
        FileOutputStream fos = null;
        Statement st = null;
        ResultSet rs = null;
        String sql ="select CO_ARCHIVO, " +
                    "       NOMBRE_ARCHIVO, " +
                    "       BIN, " +
                    "       FX_ALTA " +
                    "from archivos " +
                    "WHERE CO_ARCHIVO = '" + idBLOB + "' ";
     
        try{
            st = cn.createStatement();       
            rs = st.executeQuery(sql);
            if (rs.next())
            {               
                String pathname=
path + "\\" + rs.getString("NOMBRE_ARCHIVO") ;
                File file = new File(pathname);
                fos = new FileOutputStream(file);                   
                Blob bin = rs.getBlob("BIN");
                InputStream inStream = bin.getBinaryStream();
                int size = (int)bin.length();
                byte[] buffer = new byte[size];
                int length = -1;
                while ((length = inStream.read(buffer)) != -1)
                {
                  fos.write(buffer, 0, length);               
                }                                       
            }
        }
        catch (IOException ioe)
        {
            throw new IOException(ioe.getMessage());
        }
        finally
        {
            if (fos != null)
                fos.close();
            if (rs != null)
                rs.close();
            rs = null;
            st = null;       
        }       
    }
}

class GestorDeConexiones
{
    private String user;
    private String password;
    private Connection conn = null;
    private boolean conectado = false;

    public  GestorDeConexiones(String usr, String pwd){
        user = usr;
        password = pwd;
    }

    public void closeConnection() throws SQLException{
        if (conectado)
            conn.close();
    }
   
    private void conectar() throws SQLException   {
       
        String url;              
        DriverManager.registerDriver(new OracleDriver());
       

       // url = "jdbc:oracle:oci:@<TNS_NAME>";
       // url = "jdbc:oracle:thin:@<server>:<port=1521>:<SID>";

        url = "jdbc:oracle:oci:@ORACLEBD";
        conn = DriverManager.getConnection(url,user, password);
        System.out.println("Conexion correcta");
        conectado = true;
       
    }
   
    public Connection getConnection() throws SQLException
    {
        if (!conectado)
            conectar();
        return conn;
    }       
}       

 Saludos, DJK


 Versión para imprimir  Foros de consulta

 
excelente por Juan Carlos Espejo
Respuesta recibida el [27/03/2007 08:40:19]
muy bueno se puede hacer en power builder con ASE 12.5.1
tngo una rutina pero hasta ahora no veo resultados buenos... escribeme un correo y t la mando haber si me podrian ayudar ...(elmaildelpepa@gmail.com)

 
Ingeniero por Marcelo Ramirez
Respuesta recibida el [10/05/2007 01:49:16]
La ayuda es gran importancia, pero Pedro tengo una duda...como leo datos blob y inserto datos a campos blob desde developer la version que uso es 6i y 10g please ayudame si??? mandame un consejo a marce_sha7@hotmail.com

 
Archivos word o pdf por Angelica
Respuesta recibida el [21/06/2007 08:01:14]
El articulo y las explicacion es bastante clara, gracias.
Tengo dos preguntas: es posible grabar el archivo en el cliente?,
es posible abrir el archivo en el cliente, modificarlo y volverlo a subir al directorio?

 
HOLA! MUCHAS GRACIAS, ME GUSTA... por MBE
Respuesta recibida el [21/09/2007 01:48:45]
HOLA! MUCHAS GRACIAS, ME GUSTARIA SABER COMO RECUPERAR BLOB DE ORACLE PERO CON UN PL/SQL SIN NECESIDAD DE USAR JAVA 
GRACIAS!

 
Campos blob por Giovanny Rodriguez
Respuesta recibida el [24/10/2007 11:40:19]
La ayuda es gran importancia, pero Pedro tengo una duda...como leo datos blob y inserto datos a campos blob desde developer la version que uso es 6i y 10g please ayudame si??? mandame un consejo a giovarm77@hotmail.com, te cuento que cree un bloque pero el momento de consultar de la tabla me da un error que dice: ORA-00932: inconsistent datatypes: expected  got 

 
imagen bloq c# por Anónimo
Respuesta recibida el [19/11/2007 10:16:15]
como mostrar una imagen de un campo bloq desde c# de .NET

 
Porfa C# con oracle por Edrey
Respuesta recibida el [30/11/2007 03:50:46]
Alguno de ustedes sabe cómo mostrar una imagen almacenada en un campo BLOB en ORACLE desde una ASPX desde C#????????????

Si todavía existe un alma piadosa, porfavor escríbanme a rodneyfred_007@hotmail.com

 
video en .net por Fulanito
Respuesta recibida el [22/01/2008 09:27:12]
xfa necesito obtener el video almacenado en oracle para visualizarlo en reproductor desarrollado en visual basic.net

 
video en .net por Fulanito por Fulanito
Respuesta recibida el [22/01/2008 09:29:08]
xfa pedro responde a esta duda a cieljei@yahoo.com

 
Excelente aporte por Luis Geovanni Garcia
Respuesta recibida el [30/07/2008 11:52:38]
Pedro gracias, por tus aportes en esta pagina que me ha sacado ya varias de apuros y dudas. Espero y sigas contestando nuestras dudas y nos ayudes a formar parte de este grupo tan selecto de personas. Saludos
canzion23@yahoo.es

 
VB6 por Juan
Respuesta recibida el [15/08/2008 03:28:38]
Se podra los mismo con VB6..

 
datos jpg a blob de oracle por Jordi
Respuesta recibida el [04/09/2008 12:24:07]
hola,

no se como insertar en formato blob una imagen jpg en una tabla oracle.
El fichero jpg ya lo tengo seleccionado y en una var File.
podría alguien ayudarme?

Es un poco urgente

Muchas gracias a todos por adelantado

Jordi.

 
Como haria con Bd sql Server 2000 o 2005 por Alexis
Respuesta recibida el [07/10/2008 01:49:46]
Como haria con Bd sql Server 2000 o 2005 please m msn es alexis.ad@hotmail.com

 
Recuperar Imagenes de un campo BLOB por Pablo
Respuesta recibida el [11/11/2008 01:13:52]
Hola, necesito recuperar imagenes almacenadas en un campo BLOB y llevarlas al disco. Sabe alguièn como hacer eso ???

Muchas gracias

 
Recuperar Imagenes de un campo BLOB 2 por Pablo
Respuesta recibida el [11/11/2008 01:15:08]
Perdón, no indiqué que trabajo con una BD Oracle 9i.

 
RAW con UTL_MAIL por Mario
Respuesta recibida el [18/02/2009 12:52:15]
Hola a todos. Estoy utilizando el package utl_mail que viene con la release 10g, este package tiene una procedure utl_mail.send_attach_raw para enviar attachs, estoy enviado el email pero al abrirlo me muestra el contenido del archivo adjunto y no el archivo para descargarlo. el mime-type del email lo puse en multipart/mixed y al mime-type del adjunto application/zip porque es un zip el que envío. en todos los casos que probé siempre me mostro el contenido y no el archivo. Para enviar los datos a oracle estoy utilizando c++ y ado. Alguién podría ayudarme. Adjunto una pequeña muestra como ejemplo.

This is a multi-part message in MIME format.
--------------4D8C24=_23F7E4A13B2357B3
Content-Type: multipart/mixed;
Content-Transfer-Encoding: 7bit

Este es un mensaje de prueba


--------------4D8C24=_23F7E4A13B2357B3
Content-Type: application/zip;
name="Estad_Template.zip"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
filename="Estad_Template.zip"


UEsDBBQAAAAIAHRcLToF1b7XfA8AAABWAAASAAAARXN0YWRfVGVtcGxhdGUueGxz
7ZwPbCRVHcd/b3a73b/t7l7//9lOt///9/5w1/vb9ujBFXtyHke8SKG31y5cvbZb
tzUWA6EKJhgxnkICIWcAAwJy4BkJYnI5i4cGEoxGIaiQCIoJGo34L2CEW3+/997s
7nt9xUODgu6bzMy+73zn834z+97MvJnZ/dEPIy/d842al0FLu8AF5zI+8ORpDMcO

 
Excelente por Tehuacan
Respuesta recibida el [26/03/2009 10:00:18]
Gracias DJK, encontre aqui respuesta a lo que buscaba y aprendi.
:)
saludos

::

 
Incoherencia por DAHE
Respuesta recibida el [05/06/2009 12:19:16]
Viejo tu codigo funciona pero me puedes ayudar con una duda la cantidad de imagenes que deseo recuperar es muy grande(30,000) te comento que al tratar de bajar 17500 imagenes el hace el proceso normalmente si error pero no me baja las 17500 imagenes sino 16845 uso oracle 9i me puedes dar una ayuda con esto

 
Excepcion por david
Respuesta recibida el [08/06/2009 09:09:25]
Intento recuperar el BLOB y me da este error al ejecutar la sql con un OC4J enbebido en JDeveloper:
"java.sql.SQLException: ORA-03115: representación o tipo de dato de la red no soportado".
Si alguien sabe que me falta mandenme un mail a pedropicajr@hotmail.com, muchisimas gracias.

 
Que pasa si cuando yo intento ... por Sergio Diaz
Respuesta recibida el [18/06/2009 09:54:05]
Que pasa si cuando yo intento consultar a la una tabla de la base
de datos otro otro esta actualizando esa misma tabla


Añadir comentario ... Para preguntar utiliza los foros
Autor:

Título:


Para preguntar utiliza los foros.



 Versión para imprimir

Recuperar datos BLOB de ORACLE
Autor: Pedro Herrarte Sánchez
Visitas: 26677 Fecha de publicación: 19/09/2006
Pedro Herrarte, es consultor independiente, ofreciendo servicios de consultoría, análisis, desarrollo y formación.

Posee mas de diez años de experiencia trabajando para las principales empresas de España.

Es especialista en tecnologías .NET, entornos Web, bases de datos (SQL Server y ORACLE) e integración de sistemas.

Es experto en desarrollo (C#, ASP.NET, VB.Net, T-SQL, PL/SQL, , ASP, CGI , C, Pro*C, Java, Essbase, Vignette, PowerBuilder y Visual Basic ...) y bases de datos (SQL Server y ORACLE).

Es fundador, diseñador y programador de www.devjoker.com.




Visitas: 198 | Comentarios: 0 | Archivo: Articulos
Categorias: C#
Visitas: 297 | Comentarios: 1 | Archivo: Articulos
Visitas: 376 | Comentarios: 1 | Archivo: Articulos
Categorias: Humor
Visitas: 599 | Comentarios: 3 | Archivo: Articulos
Categorias: C#|ASP.NET
Visitas: 1171 | Comentarios: 4 | Archivo: Articulos
Visitas: 689 | Comentarios: 1 | Archivo: Articulos
Categorias: ASP.NET|ASP|Windows XP|Windows 2003
Visitas: 821 | Comentarios: 2 | Archivo: Articulos
Categorias: Java|Solaris
Visitas: 576 | Comentarios: 0 | Archivo: Articulos
Visitas: 1461 | Comentarios: 1 | Archivo: Articulos
Categorias: ADO.NET
Visitas: 1513 | Comentarios: 3 | Archivo: Articulos
Categorias: ASP.NET

Útimos temas recibidos en los foros ...
objetos helper php bajo oracle por objetos_helper_oracle ... [ISAPI] 0 02/07/2009
ranuras isa o pci por sara ... [Access] 5 30/03/2006
descargar tutorial C# por afmp ... [C#] 54 14/10/2008
Tutorial TOAD para Oracle en Español por ijpj ... [ORACLE] 19 14/03/2009
quiero mi numero de mi autogenerado por pablo ... [Visual Basic .NET] 1 15/06/2009
Ayuda con cargar fotografias de otra pc por Alex ... [ASP.NET] 0 01/07/2009
splash screen por zelca ... [Visual Basic .NET] 0 01/07/2009
Error de inicio de aplicación por Danrre ... [C#] 0 30/06/2009
sumar los precios de la columna "precio" del grig por jardinderosas ... [C#] 7 01/11/2007
Curso de Fundamentos de Java en vídeo. por Videocursos ... [Java] 4 08/03/2009
Ayuda a resolver un Codigo solo en Consola por RonaldP ... [Visual Basic .NET] 0 30/06/2009
Interface de especificaciones Modulo de calidad por Richard ... [ORACLE] 0 30/06/2009

Access CGI JSP ORACLE UNIX
Actualidad HTML/DHTML/XHTML LINUX PHP Visual Basic .NET
ASP ISAPI MS DOS Power Builder Visual Basic 6.0
ASP.NET Java mySQL SQL WIN 98/NT/2000/XP
C# JavaScript Opinion SQL Server

devjoker  Te recomendamos además ...
04/01/2007 Modificadores de visibilidad de bloques get y set    forma parte de...Tutorial C#
12/01/2006 Programación con PL/SQL    forma parte de...Tutorial PL/SQL
01/04/2006 Estructuras de control en PL/SQL    forma parte de...Tutorial PL/SQL
31/03/2006 Operadores en PL/SQL    forma parte de...Tutorial PL/SQL
12/01/2006 Introducción a PLSQL    forma parte de...Tutorial PL/SQL
31/03/2006 Tipos de datos en PL/SQL    forma parte de...Tutorial PL/SQL
29/09/2006 MSIL - Microsoft Intermediate Language    forma parte de...Conceptos generales .NET
22/10/2005 Componentes del lenguaje SQL    forma parte de...Tutorial SQL
24/07/2006 Transacciones autónomas    forma parte de...Tutorial PL/SQL
30/11/2006 Lectura de atributos en tiempo de ejecución    forma parte de...Tutorial C#

 

Encuesta
¿A que perfil te adaptas mejor?
[Ver] [Votar]