InicioArticulos y noticiasBases de datosProgramaciónForosInternetServiciosEmail
También puedes ver ...
Excepciones personalizadas en PL/SQL
Como conectar a ORACLE con Java
Recuperar datos BLOB de 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


 Versión para imprimir

Trabajar con datos de tipo BLOB en ORACLE

    En este artículo vamos a explicar como podemos trabajar con datos binarios en ORACLE. Los datos binarios nos van a permitir guardar en la base de datos archivos, imagenes, sonidos, etc ...

     Casi siempre es preferible guardar la ruta del archivo en la base de datos en lugar del propio archivo en modo binario, pero existen ciertas circunstancias en las que no nos queda otra solución.

    Lo que vamos a hacer es cargar un fichero existente en el servidor en un campo BLOB de una tabla.

    Lo primero que debemos hacer es crear un objeto directorio, esto es necesario ya que el fichero que queremos guardar se encuentra en el servidor (PL/SQL se ejecuta en el servidor), y debemos permitir explicitamente el acceso al directorio en cuestión al usuario que ejecutará el PL. El siguiente script SQL crea el directorio (¡ojo! el objeto ORACLE directorio, no el directorio físico del servidor que debe existir), asigandole el nombre lógico images. Para poder crear el directorio debemos haber iniciado session como dba.


CONNECT
sys/&password@ORACLEBD as sysdba;
CREATE
OR REPLACE
DIRECTORY IMAGES AS 'C:\ORACLE\BLOB\IMAGES';

    Como ya hemos dicho, para crear directorios debemos haber iniciado la sessión con permisos de dba, por lo que debemos asignar permisos a los usuarios que necesitemos o queramos. 


GRANT READ ON DIRECTORY IMAGES to APP1 WITH GRANT OPTION;
GRANT READ ON DIRECTORY IMAGES to PUBLIC;

    Lo siguiente que vamos a necesitar es una tabla con un campo BLOB, para almacenar la imagen. En este caso vamos a llamar a la tabla "archivos", y su estructura será la siguiente:


CREATE TABLE ARCHIVOS
(CO_ARCHIVO     VARCHAR2(6)   not null,
 NOMBRE_ARCHIVO VARCHAR2(100) not null,
 BIN            BLOB              null,
 FX_ALTA        DATE              null,
 CONSTRAINT PK_ARCHIVOS PRIMARY KEY (CO_ARCHIVO)
 )

    El siguiente bloque de PL nos va a permitir cargar una imagen, llamada "imagen.gif" en la tabla. Es importante tener claro que el archivo "imagen.gif" debe existir físicamente el directorio IMAGES (C:\ORACLE\BLOB\IMAGES) que hemos creado anteriormente.


DECLARE
  l_bfile  BFILE;
  l_blob   BLOB;
BEGIN
  INSERT INTO ARCHIVOS
(CO_ARCHIVO, NOMBRE_ARCHIVO, BIN, FX_ALTA)
  VALUES
('000001','imagen.gif',EMPTY_BLOB(),SYSDATE)
RETURN BIN INTO l_blob;


 
l_bfile := BFILENAME('IMAGES', 'imagen.gif');
  DBMS_LOB.fileopen(l_bfile, Dbms_Lob.File_Readonly);
  DBMS_LOB.loadfromfile(l_blob,l_bfile,DBMS_LOB.getlength(l_bfile));
  DBMS_LOB.fileclose(l_bfile);
  COMMIT;

EXCEPTION WHEN OTHERS THEN
   ROLLBACK;
   RAISE;
END;

    Hay tres aspectos a comentar de este código:

  • El uso de RETURN en la sentencia INSERT. Nos permite establecer una referencia al campo BIN insertado en la variable l_blob, de tipo BLOB.
  • La función EMPTY_BLOB.Nos permite insertar un valor nulo en un campo BLOB.
  • La función BFILENAME. Esta función devuelve un objeto BFILE que representa la ruta del fichero "imagen.gif" que queremos almacenar en la tabla.
  • El uso del paquete predefinido de ORACLE DBMS_LOB. Es el paquete que proporciona ORACLE para trabajar con tipos binarios. Utilizamos la siguientes funciones:
    • fileopen: Abre el archivo definido por BFILE (l_bfile) en el modo indicado (en nuestro caso solo lectura Dbms_Lob.File_Readonly)
    • loadfromfile: Lee un determinado número de bytes (en nuestro caso todos) del fichero definido por BFILE(l_bfile) en un objeto de tipo BLOB (l_blob).
    • getlength:Devuelve el tamaño del archivo en bytes.
    • fileclose:Cierra el archivo

    Llama la atención de este código que a persar de haber insertado el campo BIN vacio con la función EMPTY_BLOB, finalmente queda cargado sin ejecutar ninguna sentencia UPDATE. Esto ocurre porque  estamos utilizando RETURN en la sentencia INSERT y guardando una referencia al campo BIN que posteriormente asignamos al leer el archivo con DBMS_LOB.loadfromfile.

    El resultado de todo esto es que hemos conseguido almacenar la imagen en la base de datos.


[Ampliar Imagen]

    En el siguiente artículo explicamos como utilizar esta imagen en una aplicación cliente.

    Saludos, DJK 


 Versión para imprimir  Foros de consulta

 
Blob en forms 6i por Moni
Respuesta recibida el [05/07/2007 02:52:19]
Gracias por el código me sirvio de mucho. pero ahora necesito saber como recupero la imagen en un campo en forms 6i

 
Oracle Forms 6i por xBrYaNx
Respuesta recibida el [10/08/2007 12:59:48]
Muy Facil solo crea un datablock de esa tabla y te aparece un campo Imagen...

 
Solo Funciona con una imagen por Christian..
Respuesta recibida el [27/08/2007 03:18:18]
Para utilizar el mismo código e insertar mas registros de imágenes sales el error 

ORA-22288: file or LOB operation FILEOPEN failed
El sistema no puede hallar el archivo especificado.
ORA-06512: at "SYS.DBMS_LOB", line 523
ORA-06512: at "SYS.AGREGA_IMAGEN_BLOB", line 14
ORA-06512: at line 1

Siendo que todas las imágenes están en el mismo directorio.. URGENTE!!! chrisrcp@hotmail.com

 
Solo funciona con una imagen..(cont) por Sonia
Respuesta recibida el [12/09/2007 02:37:46]
A mi me sale el mismo error ORA-22288: file or LOB operation FILEOPEN failed. El sistema no puede hallar el archivo especificado. 

Alguna ayuda..

 
Tengo que bajar del disco C:/ ... por Rebeca
Respuesta recibida el [18/09/2007 02:26:48]
Tengo que bajar del disco C:/ de la PC a un campo blob de una tabla de la base de datos Oracle 10g 
Ya se cómo pasarlo del directorio virtual a la tabla. Pero, estoy investigando cómo bajarlo del C:/ de mi PC al directorio virtual. Mil gracias,

 
problemas con datos blob por brenda
Respuesta recibida el [29/01/2008 12:53:54]
hola
no puedo desplegar una imagen guardada en una bd oracle. ejecuto tu ejemplo y no me marca errores, pero tampoco despliega nada

 
imagenes en la base por pablin
Respuesta recibida el [21/03/2008 12:14:27]
hola.
tengo una duda como podria extraer una image para cargarla en un aplicativo que tengo es Adobe flex he intentado pero no sin resultado inicialmente hago un select en php y fresco me devuelve solo los datos de los otros campos menos el del campo que contiene la imagen....


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

Título:


Para preguntar utiliza los foros.



 Versión para imprimir

Trabajar con datos de tipo BLOB en ORACLE
Autor: Pedro Herrarte Sánchez
Visitas: 17068 Fecha de publicación: 11/09/2006
Pedro Herrarte, es consultor tecnológico en nCapas Software(empresa de la que además es fundador), donde realiza tareas de consultoría, análisis y desarrollo.

Ha trabajado con muchas tecnologías ... SQL Server, T-SQL, ORACLE, PL/SQL, ASP.NET, ASP, CGI , C#, C, Pro*C, Java, Essbase, Vignette, PowerBuilder y Visual Basic ...

Es especialista en tecnologías .NET, entornos Web, y bases de datos, especialmente SQL Server y ORACLE.

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



devjoker  Lo más nuevo ... Donde se habla ... 
03/04/2008 LINQ con métodos Extensores y expresiones lambda    forma parte de...Métodos extensores
03/04/2008 Métodos Extensores: SELECT    forma parte de...Métodos extensores
03/04/2008 Almacenamiento (1)    forma parte de...Tutorial de Sistemas Informaticos
28/03/2008 Mapa de configuracion de WCF
28/03/2008 LinQ To SQL - Un ejemplo sencillo
25/03/2008 Sitios Web de ejemplo ASP.NET
22/03/2008 Problemas al conectar a redes wifi con Windows Vista
19/03/2008 Service Pack 1 de Windows Vista

Útimos temas recibidos en los foros ...
Insertar datos en un grid manualmente por flakita ... [C#] 0 09/04/2008
ayuda con un select por Manu ... [mySQL] 8 25/07/2007
CHASIS DE UN PC CUALQUIERA por carolina ... [WIN 98/NT/2000/XP] 5 23/11/2006
Q PASA JENTE por torrichi ... [Java] 2 25/03/2008
LLINQ to SQL por Javier ... [C#] 1 09/04/2008
Agendar tarea por dia pero q pueda ser a diferente hora cada dia por Orlan ... [C#] 1 09/04/2008
Ventana Popup por Maurito22 ... [ASP.NET] 1 31/03/2008
No se puede abrir el archivo fisico por ron ... [C#] 1 07/04/2008
Data report visual basic 6.0 impresion con codigo por Andres ... [Visual Basic 6.0] 8 19/11/2007
Como abrir un docuemto de word desde c# y leer las palabras para luego enviar a access por llen ... [C#] 1 08/04/2008
sentencia for por .net ... [C#] 2 08/04/2008
Leer campos blob de oracle en lenguaje visual basic por janito ... [Visual Basic 6.0] 0 08/04/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 ...
22/10/2005 Insertar datos. INSERT    forma parte de...Tutorial SQL
24/05/2007 Tipos de datos en Transact SQL    forma parte de...Tutorial de Transact SQL
12/01/2006 Programación con PL/SQL    forma parte de...Tutorial PL/SQL
16/10/2006 Delegados y eventos    forma parte de...Tutorial C#
14/05/2007 Fundamentos de Transact SQL    forma parte de...Tutorial de Transact SQL
31/03/2006 Operadores en PL/SQL    forma parte de...Tutorial PL/SQL
11/09/2006 Trabajar con datos de tipo BLOB en ORACLE
12/01/2006 Introducción a PLSQL    forma parte de...Tutorial PL/SQL
20/03/2008 Funciones integradas de Transact SQL (I)    forma parte de...Tutorial de Transact SQL
28/08/2006 Ubuntu en VmWare con VMware Tools

 

Encuesta
¿Cual es tu lenguaje de programación favorito?
[Ver] [Votar]