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.