 |
|
 |
| 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:
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 |
| |
 |
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
|
| Añadir comentario ... |
Para preguntar utiliza los foros
|
|

|
Recuperar datos BLOB de ORACLE |
|
Autor:
Pedro Herrarte Sánchez
|
|
Visitas:
17736 |
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. |
|
Visitas:
310
|
Comentarios:
0
|
Archivo:
Articulos
|
Visitas:
85
|
Comentarios:
0
|
Archivo:
Articulos
|
Visitas:
206
|
Comentarios:
0
|
Archivo:
Articulos
|
Visitas:
937
|
Comentarios:
0
|
Archivo:
Articulos
|
Visitas:
209
|
Comentarios:
0
|
Archivo:
Articulos
|
Visitas:
675
|
Comentarios:
0
|
Archivo:
Articulos
|
Visitas:
455
|
Comentarios:
0
|
Archivo:
Articulos
|
Visitas:
236
|
Comentarios:
0
|
Archivo:
Articulos
|
Visitas:
1135
|
Comentarios:
1
|
Archivo:
Articulos
|
Visitas:
789
|
Comentarios:
0
|
Archivo:
Articulos
|
|
|
|
 |
| Encuesta |
|
¿A que perfil te adaptas mejor? |
|
|
|
|
|
|
|
|
 |