miércoles, 13 de octubre de 2021

Extraer archivos .JPG desde campo Blob Oracle 10g, 11g y 12c

 En el presente blog, dejare como validar que tipo de imagen se encuentra almacenada en columna BLOB , cuanto pesa la imagen y como puede ser extraida de la base de datos hacia un directorio del sistema operativo.

select para saber que tipo de imagen se encuentra almacenada

select case when dbms_lob.substr(MCIMAGE1,3,1) = hextoraw('FFD8FF') then 'JPG' end as image_type
FROM esquema.Tabla
         WHERE     MCDATE  = '20181201'
               AND MCLOCATION = '0902E'
               and mctime = '090251';                
   

select para saber cuanto pesa en KB la imagen           
SELECT max(round(DBMS_LOB.getlength(MCIMAGE1)/1024)) KB ,max(MCSIZE1)
   FROM  esquema.Tabla
         WHERE     MCDATE BETWEEN '20181201' AND '20181231'
               AND MCLOCATION IN ('0902E', '0902S');


Plsql Anonimo para extraer los datos

/* Formatted on 10/12/2021 3:45:08 PM (QP5 v5.336) */

declare
    l_file       UTL_FILE.FILE_TYPE;
    l_buffer     RAW (32767);
    l_amount     BINARY_INTEGER := 32767;
    l_pos        INTEGER := 1;
    l_blob       BLOB;
    l_blob_len   INTEGER;

    CURSOR C1 IS
          SELECT MCID,
               MCDATE,
               MCTIME,
               MCIMAGE1,
               MCID||'-'||mclocation||'-'||mcdate||'-'||mctime||'-C01-'||to_char(rownum)||'.JPG' nombre1
          FROM esquema.Tabla
         WHERE     MCDATE BETWEEN '20181201' AND '20181201'
               AND MCLOCATION IN ('0902E', '0902S');
BEGIN
    FOR R1 IN C1
    LOOP
        l_blob := r1.MCIMAGE1;
        l_blob_len := DBMS_LOB.getlength (r1.MCIMAGE1);
        l_pos := 1;

        -- Open the destination file.

       -- IF l_blob_len < 32767
       -- THEN
            l_file :=
                UTL_FILE.FOPEN ('export_Dir',R1.nombre1,'W',32767);

            -- until complete.

            WHILE l_pos < l_blob_len
            LOOP
                DBMS_LOB.READ (l_blob,
                               l_amount,
                               l_pos,
                               l_buffer);

                UTL_FILE.put_raw (l_file, l_buffer, TRUE);

                l_pos := l_pos + l_amount;
            END LOOP;

            -- Close the file.

            UTL_FILE.FCLOSE (l_file);
       -- END IF;
    END LOOP;
EXCEPTION
    WHEN OTHERS
    THEN
        -- Close the file if something goes wrong.
        IF UTL_FILE.IS_OPEN (l_file)
        THEN
            UTL_FILE.FCLOSE (l_file);
        END IF;
        RAISE;
END;

espero les sea de utilidad , dejen sus comentarios.