lunes, 18 de julio de 2016

Como insertar imagenes JPG a una tabla en Oracle

INSERTAR IMAGENES JPG EN ORACLE


Dentro de las actividades de un DBA se encuentra la generación de distintos objetos, entre ellos las tablas, y en ocasiones tendremos que trabajar con imágenes. Para tratar con este tipo de datos es recomendable utilizar BLOB, que básicamente permite almacenar contenido multimedia dentro de una base de datos.

Una forma de insertar imagenes JPG en una tabla de Oracle es mediante un desarrollo en .NET, ademas de procedimientos generados en Oracle, este segundo es el que veremos a continuación:

INSERTAR IMAGENES JPG EN ORACLE

PASO 1) CREAR UN DIRECTORIO VIRTUAL EN ORACLE CON EL USUARIO SYS, DAR PRIVILEGIOS A SYSTEM SOBRE EL DIRECTORIO

CREATE DIRECTORY IMAGENES_LOGIC AS '/opt/oracle/IMAGENES';

GRANT READ, WRITE, EXECUTE ON DIRECTORY IMAGENES_LOGIC TO SYSTEM;


PASO 2) SUBIR LAS IMAGENES JPG A ESE DIRECTORIO VIRTUAL EN ORACLE MEDIANTE CUALQUIER HERRAMIENTA QUE PERMITA CONEXION FTP (WINSCP, MOBAXTERM, ETC)


PASO 3) GENERAR UNA LISTA (LLAMADA cadena.txt) CON LA CADENA DEL NOMBRE DE LAS IMAGENES Y CON EL ID DE LA IMAGEN, EN ESTE CASO LA LISTA CONTIENE LO SIGUIENTE;

25468, '25468_IMAGEN.jpg'
25461, '25461_IMAGEN.jpg'
25462, '25462_IMAGEN.jpg'
25464, '25464_IMAGEN.jpg'
.... ..... .....
... .... .....

DONDE:

'3061815_CLF01_PRE.jpg' --> ES EL NOMBRE DE LA IMAGEN
3061815 --> ES EL ID DE LA IMAGEN



PASO 4) GENERAR UN TABLESPACE PARA EL NUEVO USUARIO USUARIO_IMAGEN_DATA;


CREATE TABLESPACE USUARIO_IMAGEN_DATA
DATAFILE '/bd/oradata03/mibase/USUARIO_IMAGEN_DATA_01.dbf' SIZE 500M,
         '/bd/oradata04/mibase/USUARIO_IMAGEN_DATA_02.dbf' SIZE 500M;



PASO 5) CREAR UN USUARIO  USUARIO_IMAGEN;

CREATE USER USUARIO_IMAGEN
  IDENTIFIED BY  "USUARIO_IMAGEN"
  DEFAULT TABLESPACE USUARIO_IMAGEN_DATA
  TEMPORARY TABLESPACE TEMP
  PROFILE DEFAULT
  ACCOUNT UNLOCK;

  GRANT UNLIMITED TABLESPACE TO USUARIO_IMAGEN;


PASO 6) CREAR LA TABLA USUARIO_IMAGEN.TABLA_IMAGENESS

CREATE TABLE USUARIO_IMAGEN.TABLA_IMAGENESS
(
 ID_IMAGEN NUMBER,
 NOMBRE_IMAGEN VARCHAR2(50),
 IMAGEN BLOB
)
TABLESPACE USUARIO_IMAGEN_DATA;


PASO 7) CREAR UN PROCEDIMIENTO QUE INSERTE LAS IMAGENES

CREATE OR REPLACE PROCEDURE INSERTA_IMAGEN_DE_DIRECTORIO (p_id NUMBER, p_image_name IN VARCHAR2)
IS
   src_file   BFILE;
   dst_file   BLOB;
   lgh_file   BINARY_INTEGER;
BEGIN
   src_file := BFILENAME ('IMAGENES_LOGIC', p_image_name);

   -- insert a NULL record to lock
   INSERT INTO USUARIO_IMAGEN.TABLA_IMAGENESS
               (ID_IMAGEN, NOMBRE_IMAGEN, IMAGEN
               )
        VALUES (p_id, p_image_name, EMPTY_BLOB ()
               )
     RETURNING IMAGEN
          INTO dst_file;

   -- lock record
   SELECT     IMAGEN
         INTO dst_file
         FROM USUARIO_IMAGEN.TABLA_IMAGENESS
        WHERE ID_IMAGEN = p_id AND NOMBRE_IMAGEN = p_image_name
   FOR UPDATE;

   -- open the file
   DBMS_LOB.fileopen (src_file, DBMS_LOB.file_readonly);
   -- determine length
   lgh_file := DBMS_LOB.getlength (src_file);
   -- read the file
   DBMS_LOB.loadfromfile (dst_file, src_file, lgh_file);

   -- update the blob field
   UPDATE USUARIO_IMAGEN.TABLA_IMAGENESS
      SET IMAGEN = dst_file
    WHERE ID_IMAGEN = p_id AND NOMBRE_IMAGEN = p_image_name;

   -- close file
   DBMS_LOB.fileclose (src_file);
END INSERTA_IMAGEN_DE_DIRECTORIO;
 /

PASO 8) CREAR UN SCRIPT (LLAMADO insertate.ksh) QUE INSERTE LAS IMAGENES DESDE EL PROCEDIMIENTO CON UN WHILE

#!/usr/bin/ksh


# |--------------------------------------------|
# |-- Configuracion de variables de Ambiente --|
# |--------------------------------------------|

while read VARIABLE
do
export $VARIABLE
done < /opt/oracle/varibles_ambiente.var
export PATH=$PATH:$ORACLE_HOME/bin:.


# |------------------------------------|
# |-- Generacion de sentencia while  --|
# |------------------------------------|

while read CADENA
do
sqlplus -s ${USUARIO_ORACLE}/${USER_PASS}@$ORACLE_SID<<EOF
EXECUTE sys.INSERTA_IMAGEN_DE_DIRECTORIO($CADENA);
commit;
EOF
done </opt/oracle/cadena.txt


PASO 9) EJECUTAR EL SCRIPT insertate.ksh EN MODO DEBUG

ksh -xv insertate.ksh


Dudas/Comentarios aqui:



4 comentarios:

  1. Genial me sirvió mucho, gracias! :D

    ResponderEliminar
  2. No es lo que andaba buscando, pero me parece genial y no me aguanto para implementarlo en algún proyecto. Muchas gracias.

    ResponderEliminar