InicioArticulos y noticiasBases de datosProgramaciónForosInternetServiciosContratacionEmail
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


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....

 
NECESITO AYUDA por Lucy
Respuesta recibida el [17/04/2008 09:48:49]
COMO PUEDO INSERTAR VIDEO Y FOTOGRAFIAS A UNA BASE DE DATOS ORCLE 9I

 
Cómo bajo la información por Areabi
Respuesta recibida el [30/04/2008 11:47:12]
Bien, una vez que esta en la base de datos, cómo puedo bajar esa información a mi PC ???

 
Pero ahora como INSERTO VIDEOS A MI BASE DE DATOS por Edgar
Respuesta recibida el [09/05/2008 05:46:40]
Me parecio muy interesante, pero me gustaria ver si alguien sabe como insertar videos a mi Base de datos SQL, pero no con un link, ni con una URL, sino tener un video en mi Base de Datos. Gracias!

 
Como inserto blob desde php por Jaime
Respuesta recibida el [24/06/2008 06:10:12]
Se que el foro es de Oracle pero alguien sabe como insertar una imagen a Oracle desde PHP o algún link con ese código.

Gracias de antemano

 
Error al enviar email por Hernan Rodríguez
Respuesta recibida el [05/08/2008 12:30:48]
La aplicación genera archivos PDF y  realiza envíos masivos de correos electrónicos a proveedores y los guarda en un directorio del servidor.

Se está utilizando el paquete UTL_EMAIL y dentro de este, el procedimiento "Envía_Email".


Parte de la programación utiliza el siguiente código:
--
fil := BFILENAME (p_directory, v_attach);

file_len := DBMS_LOB.GetLength (fil);

modulo := MOD (file_len, amt);

pieces := TRUNC (file_len / amt);

IF (modulo <> 0) THEN
pieces := pieces + 1;
END IF;

/* Open the file */
DBMS_LOB.FileOpen (fil, DBMS_LOB.file_readonly);

/* Read the first amt into the buffer */
DBMS_LOB.READ (fil, amt, filepos, buf);
--

Estuvo funcionando bien, pero un día dio el error "ORA-22288: file or LOB operation GetLength failed. El sistema no puede hallar el archivo especificado."

O bien, en lugar del GetLength, error con el FileOpen.

Que puede ser? Ya dimos permisos al servidor y al directorio respectivo donde se guardan los archivos PDF y nada.

Urge. Gracias,

 
lo mismo que a hernan por xoco
Respuesta recibida el [01/09/2008 07:20:16]
me ocurrió lo mismo. guardaba en bdd perfectamente y de buenas a primeras, ya no. yo intento abrir la tabla (con el toad) y lo vuelco a disco (son ficheros pdf) y no lo abre. cumple el tamaño, etc pero nada. aqui veo que esta el planteamiento de las dudas y fallas que nos da pero, ¿alguna sugerencia y/o respuesta a aplicar? gracias, saludos - xocallaghan@gamil.com

 
no encuentra directorio o archivo por richard
Respuesta recibida el [27/10/2008 08:39:18]
Hola, excelente ayuda, pero yo tambien tengo el mismo problema que se indica, no encuentra directorio o archivo, el asunto es que no puedo tener la imagen o archivo en el mismo servidor de oracle, como puedo solucionar esto...
dejo mi correo por si me pueden ayudar saludos magic_rop@homail.com

 
Error al insertar un long raw en un BLOB por May
Respuesta recibida el [27/10/2008 03:43:09]
Hola, estoy tratando de insertar un campo de tipo LONG RAW desde una tabla a otra en un campo de tipo BLOB, el campo tiene almacenado una imagen. Estoy ejecutando un bloque en PL/SQL y se insertan unos reg pero otros no y envía el error: ORA-06502: PL/SQL: numeric or value error. No entiendo el por qué de este error, no se supone que un BLOB es tiene mayor capacidad q un LONG RAW?? Gracias de antemano.

 
Archivos en PC por CRS
Respuesta recibida el [28/11/2008 07:35:33]
Hola, el procedure que proporcionas me sirvio de mucho, gracias. Pero los archivos que yo tengo que subir no van a estar en el servidor si no en diferentes PC. Como puedo tomar el archivo(s)??

Gracias de antemano

 
Gracias por JHaR
Respuesta recibida el [01/12/2008 12:49:32]
Muy buena pagina me a salvado de muchas muchas gracias por compartir

 
hola, necesito guardar archivo... por Fabricio
Respuesta recibida el [05/12/2008 09:56:12]
hola, necesito guardar archivos en oracle probe con el codigo que esta arriba pero no funciona ORA-22288: file or LOB operation FILEOPEN failed
alguna ayuda??

 
Subir archivos campo BLOB por Phoenix
Respuesta recibida el [16/12/2008 02:43:00]
Muy util este codigo pero lo que sucede es que la imagen no se la puede identificar es el unico problema?

 
links de descarga por DunkelBlume
Respuesta recibida el [05/03/2009 12:11:32]
Hola!

verán yo quiero generar links de descarga de os archivos que subo a la BD, estos archivos son PDF, como podría hacerlo? o para que se abran en el portal

de antemano muchas gracias

 
Otro error distinto por Jose
Respuesta recibida el [06/03/2009 02:53:27]
Yo acabo de implementar la escritura y lectura de ficheros pero al leer obtengo el ora-22275 invalid LOB locator. Sabeis a que puede deberse. Gracias de antemano.

 
Consulta por Luis Figueroa
Respuesta recibida el [10/06/2009 10:57:50]
Holaa, excelente aportación mil gracias!! Ahora tengo una pregunta, como hago si esto lo puse en un SP, y la ruta varía dependiendo del cliente, ya que es una aplicación web, como hago con la ruta??? De antemano gracias por su ayuda

 
S.O.S por EL GIL
Respuesta recibida el [10/06/2009 02:38:08]
AUXILIO !!!!

 
Consulta sobre LONG RAW por Lucas
Respuesta recibida el [14/07/2009 03:18:56]
Buenos dias, esta muy buena la ayuda, ahora si en ves de un campo BLOB tengo un LONG RAW??? como se hace para grabar la imagen desde un PL SQL??
Gracias

 
CONSULTA BLOB por ALEJANDRO
Respuesta recibida el [04/09/2009 07:54:47]
EN LA PARTE DEL CODIGO QUE DICE:
l_bfile := BFILENAME('IMAGES', 'imagen.gif');
cOMO PUEDO HACER CUANDO TENGA VARIAS IMAGENES?????EN TEORIA ESTO ES PARA UNA SOLA???

 
descargando un JAR file por Juanita
Respuesta recibida el [03/11/2009 01:36:24]
Alguno de usteds sabe como puedo descargar un archivo .jar desde un blob. he utilizado el metodo explicado anteriormente pero... no lo descarga completamente. por ejemplo el jar es de 83.0 kb y baja un jar file de 11.0 kb.
Cualquier ayuda la apreciaria muchisimo.


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: 58190 Fecha de publicación: 11/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: 94 | Comentarios: 2 | Archivo: Articulos
02/02/2010 iPad vs Telesketch
Visitas: 796 | Comentarios: 2 | Archivo: Articulos
Categorias: Humor
Visitas: 752 | Comentarios: 3 | Archivo: Articulos
Visitas: 3153 | Comentarios: 2 | Archivo: Articulos
Categorias: C#
Visitas: 14516 | Comentarios: 7 | Archivo: Articulos
Categorias: C#|Seguridad
Visitas: 1483 | Comentarios: 3 | Archivo: Articulos
Visitas: 692 | Comentarios: 2 | Archivo: Articulos
Visitas: 369 | Comentarios: 0 | Archivo: Articulos
Visitas: 2021 | Comentarios: 2 | Archivo: Articulos
Categorias: C#

Útimos temas recibidos en los foros ...
pensiones por 29285524 ... [Access] 0 12/03/2010
certificado de porvenir por labar ... [Actualidad] 23 02/03/2010
Certificado de afiliacion Pensiones y Cesantias por VIVIANA ... [Actualidad] 2 10/03/2010
AYUDA COMANDOS BASICOS MSDOS!! por (L)MSDOS(L) ... [MS DOS] 24 12/03/2010
mananis por mananis ... [Actualidad] 0 12/03/2010
CERTIFICADO DE PENSIONES Y CESANTIAS PORVENIR por ABELLO ... [Actualidad] 0 12/03/2010
Solicitud certificado de afiliaciones a pensiones y cesantias proteccion por hz ... [Actualidad] 55 10/02/2010
certificado de pensiones y cesantias que me exigen para trabajar por viviana ... [Actualidad] 1 12/03/2010
Certificado de pensiones por liliana ... [Actualidad] 0 12/03/2010
certificado de afiliación de pensiones y cesantias por secre ... [Actualidad] 114 28/01/2010
certificado de pensiones horizonte por carla ... [Actualidad] 21 16/02/2010
certificado de pensiones del bbva horizonte por danger ... [Actualidad] 123 12/01/2010

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 Componentes del lenguaje SQL    forma parte de...Tutorial SQL
12/06/2007 Estructuras de control en Transact SQL    forma parte de...Tutorial de Transact SQL
22/10/2005 Consultar datos. SELECT    forma parte de...Tutorial SQL
22/10/2005 El lenguaje SQL    forma parte de...Tutorial SQL
10/06/2007 Operadores en Transact SQL    forma parte de...Tutorial de Transact SQL
29/05/2007 Equivalencia de datos de SQL Server y .NET    forma parte de...Tutorial de Transact SQL
08/03/2007 Cambiar el nombre del servidor SQL Server
28/06/2006 Excepciones en PL/SQL    forma parte de...Tutorial PL/SQL
23/05/2006 Cursores en PL/SQL    forma parte de...Tutorial PL/SQL
25/08/2007 Variables en Transact SQL    forma parte de...Tutorial de Transact SQL

 

Encuesta
¿A que perfil te adaptas mejor?




[Ver] [Votar]