InicioArticulos y noticiasBases de datosProgramaciónForosInternetServiciosContratacionEmail
También puedes ver ...
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
Tipo VARRAY

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.


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: 19162 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: 302 | Comentarios: 0 | Archivo: Articulos
Categorias: ASP.NET|CSS|ASP.NET
Visitas: 137 | Comentarios: 0 | Archivo: Articulos
Categorias: TFS
Visitas: 101 | Comentarios: 5 | Archivo: Articulos
Categorias: TFS
Visitas: 429 | Comentarios: 4 | Archivo: Articulos
Categorias: Transact-SQL|LinQ
Visitas: 1448 | Comentarios: 6 | Archivo: Articulos
Categorias: Visual Basic .NET|C#|ASP.NET|ASP.NET|Programación|ADO.NET
27/09/2008 Navegando ....
Visitas: 238 | Comentarios: 0 | Archivo: Articulos
Categorias: Humor
Visitas: 611 | Comentarios: 0 | Archivo: Articulos
Categorias: Visual Basic .NET|C#|ASP.NET|ASP.NET|Programación|WCF
Visitas: 2571 | Comentarios: 4 | Archivo: Articulos
Categorias: C#
Visitas: 463 | Comentarios: 0 | Archivo: Articulos
Categorias: JavaScript|ASP.NET
Visitas: 1072 | Comentarios: 0 | Archivo: Articulos
Categorias: Windows XP|Linux|Windows Vista

Útimos temas recibidos en los foros ...
Crystal reports XI Release 2 y asp.net por mvargas ... [ASP.NET] 0 21/11/2008
Enviar un email con C# utilizando .Net FrameWork 2.0 con logo... por Moises ... [ASP.NET] 0 21/11/2008
Enviar un email con C# utilizando .Net FrameWork 2.0 por Moises ... [C#] 0 21/11/2008
Cuestión de BFILE. por Megatron ... [ORACLE] 0 21/11/2008
Enviar email por Dol ... [ASP.NET] 5 21/08/2007
*******PREGUNTA********: por T.S.U.En Informatíca ... [Visual Basic 6.0] 5 17/03/2008
Programar tareas en oracle. por Rodrigo ... [ORACLE] 0 21/11/2008
fechas con datatimepicker por peyin ... [Visual Basic .NET] 3 20/11/2008
agregar datos de un gridview a un textbox por jhors ... [ASP.NET] 3 19/09/2007
Select de sql en c# por Stuart ... [C#] 1 20/11/2008
Manual en Español de SQL Navigator for Oracle por Maira ... [ORACLE] 12 30/03/2008
Como mandar mensaje a Celular por Pako ... [C#] 40 13/03/2007

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 ...
23/05/2006 Cursores en PL/SQL    forma parte de...Tutorial PL/SQL
01/08/2006 Generar un fichero Excel con C# sin tener Excel instalado
04/01/2007 Modificadores de visibilidad de bloques get y set    forma parte de...Tutorial C#
22/10/2005 Insertar datos. INSERT    forma parte de...Tutorial SQL
21/07/2007 Insertar datos en Transact SQL    forma parte de...Tutorial de Transact SQL
03/01/2007 Tipos anulables    forma parte de...Tutorial C#
25/01/2007 Modificaciones en el compilador    forma parte de...Tutorial C#
03/10/2006 Estrcuturas de control.    forma parte de...Tutorial C#
03/10/2006 Polimorfismo    forma parte de...Tutorial C#
24/05/2006 Cursores Implicitos en PL/SQL    forma parte de...Tutorial PL/SQL

 

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