PROCEDURE EXTRACT_LOB_TO_FILE ( p_fileID NUMBER, p_directory VARCHAR2) IS var_fileName VARCHAR2 (100); blob_data BLOB; num_startPos NUMBER := 1; num_byteLen NUMBER := 32000; len NUMBER; my_vr RAW (32000); x NUMBER; l_output UTL_FILE.FILE_TYPE; BEGIN SELECT tab4.FILE_NAME, tab4.FILE_DATA INTO var_fileName, blob_data FROM FND_LOBS tab4 WHERE file_id = p_fileID; -- define output directory l_output := UTL_FILE.FOPEN (p_directory, var_fileName, 'wb', 32760); num_startPos := 1; num_byteLen := 32000; -- get length of blob SELECT DBMS_LOB.GETLENGTH (blob_data) INTO len FROM DUAL; -- save blob length x := len; -- if small enough for a single write IF len < 32760 THEN UTL_FILE.put_raw (l_output, blob_data); UTL_FILE.fflush (l_output); ELSE -- write in pieces num_startPos := 1; WHILE num_startPos < len AND num_byteLen > 0 LOOP DBMS_LOB.read (blob_data, num_byteLen, num_startPos, my_vr); UTL_FILE.put_raw (l_output, my_vr); UTL_FILE.fflush (l_output); -- set the start position for the next cut num_startPos := num_startPos + num_byteLen; -- set the end position if less than 32000 bytes x := x - num_byteLen; IF x < 32000 THEN num_byteLen := x; END IF; END LOOP; END IF; UTL_FILE.FCLOSE (l_output); END EXTRACT_LOB_TO_FILE; /
EXTRACT_LOB_TO_FILE