v_upl_blob BLOB;
vstart Number :=1;
bytelen Número :=32000;
len Número;
my_vr Raw (32000);
x Número;
l_output Utl_file.file_type;
erout varchar2(1000);
COMENZAR
SELECCIONE blob_content
EN v_upl_blob
DESDE wwv_flow_files
WHERE name =:P25_FB;
-- :p25_fb es el elemento de exploración de archivos en la página
>LEN :=Dbms_lob.getlength(V_UPL_BLOB);
l_output :=Utl_File.fopen ('MIS_ARCHIVOS', :P25_FB, 'wb', 32760);
vstart :=1;
bytelen :=32000;
IF len <32760
Entonces
Utl_File.put_raw (l_output, V_UPL_BLOB);
Utl_File.fflush (l_output);
Si no -- escribir en partes
vstart :=1;
WHILE vstart
LOOP
Dbms_lob.Read (V_UPL_BLOB, bytelen, vstart, my_vr);
Utl_File.put_raw (l_output, my_vr);
Utl_File.fflush (l_output);
-- establece la posición inicial para el próximo corte
vstart :=vstart + bytelen;
-- establece la posición final si es menor a 32000 bytes
x :=x - bytelen;
IF x <32000
Entonces
bytelen :=x;
END IF;
END LOOP;
END IF;
Utl_File.fclose (l_salida);
DELETE FROM wwv_flow_files
WHERE nombre =:P25_FB;
COMMIT;
--- llame a su procedimiento de base de datos personalizado para importar...
suprocedimientopersonalizado(:P25_FB);
EXCEPCIÓN Cuando Otros
Entonces
IF Utl_File.is_Open(l_output) Entonces
Utl_File.fclose (L_OUTPUT);
END IF;
raise;
END;