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
Secuencias
PL/SQL y Java
SQL Dinamico
Transacciones autónomas
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..


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: 16140 Fecha de publicación: 19/09/2006
Pedro Herrarte, es consultor independiente, ofreciendo sercivios 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.




18/08/2008 SQL Server 2008
Visitas: 39 | Comentarios: 0 | Archivo: Articulos
Categorias: Transact-SQL
Visitas: 131 | Comentarios: 0 | Archivo: Articulos
Categorias: C#|ADO.NET|LinQ
Visitas: 161 | Comentarios: 1 | Archivo: Articulos
Categorias: Humor
Visitas: 154 | Comentarios: 0 | Archivo: Articulos
Categorias: WCF
Visitas: 123 | Comentarios: 0 | Archivo: Articulos
Categorias: WCF
Visitas: 210 | Comentarios: 0 | Archivo: Articulos
Categorias: ASP.NET
Visitas: 278 | Comentarios: 5 | Archivo: Articulos
Categorias: ASP.NET
Visitas: 4990 | Comentarios: 4 | Archivo: Articulos
Categorias: C#|Transact-SQL|LinQ
Visitas: 602 | Comentarios: 1 | Archivo: Articulos
Categorias: Visual Studio
Visitas: 1402 | Comentarios: 1 | Archivo: Articulos
Categorias: Transact-SQL

Útimos temas recibidos en los foros ...
Y lo mismo en WEB por systemat ... [C#] 1 18/08/2008
Manual del minicom de Linux con fotos. por Meta ... [UNIX] 4 17/08/2008
PROGRAMACION por JUANMA ... [Visual Basic .NET] 1 19/08/2008
Conectar ASP con B.D Informix por Franco ... [ASP] 9 02/05/2007
Codigo salir por Jazmin ... [ASP.NET] 1 18/08/2008
EXPORTAR DATOS A ARCHIVOS PLANOS. por WIX ... [ORACLE] 10 06/08/2007
formulario por artdark ... [C#] 2 04/08/2008
Codigo salir por Jazmin ... [ASP.NET] 0 18/08/2008
cambiar de modo un gried view por ivan ... [ASP.NET] 0 18/08/2008
ayuda urgente porfavor por vicancer ... [ASP.NET] 0 18/08/2008
pollo por hajaj ... [Actualidad] 1 15/08/2008
DIOS TE BENDIGA por El You ... [WIN 98/NT/2000/XP] 1 16/08/2008

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 ...
16/11/2005 Delegados en C#
18/10/2005 Enviar emails a través de un servidor SMTP autenticado con Java
19/08/2006 Vitualización. Maquinas Virtuales.
23/12/2007 Primeras impresiones sobre Visual Studio 2008
22/10/2005 El lenguaje SQL    forma parte de...Tutorial SQL
11/09/2006 Trabajar con datos de tipo BLOB en ORACLE
06/07/2007 ¿Qué es el RSS?    forma parte de...Tutorial RSS
26/07/2006 Secuencias    forma parte de...Tutorial PL/SQL
08/09/2007 Funciones en Transact SQL    forma parte de...Tutorial de Transact SQL
12/01/2006 Introducción a PLSQL    forma parte de...Tutorial PL/SQL

 

Encuesta
Si trabajas con .NET ¿Que entorno utilizas?
[Ver] [Votar]