UTL - FILE Program (HOW TO READ & WRITE File)
UTL - FILE Program (HOW TO READ & WRITE File)
CONNECT TO HR password: hr DROP TABLE test_blob CASCADE CONSTRAINTS/ CREATE TABLE test_blob (id NUMBER(15), file_name VARCHAR2(1000), image BLOB, timestamp DATE);
********************** ** Load_blob_from_file_image.sql ******************* ****** CREATE OR REPLACE PROCEDURE Load_BLOB_From_File_Image AS dest_loc BLOB; src_loc BFILE := BFILENAME('EXAMPLE_LOB_DIR', '4.gif'); BEGIN INSERT INTO test_blob (id, file_name, image, timestamp) VALUES (1001, '4.gif', empty_blob(), sysdate) RETURNING image INTO dest_loc; DBMS_LOB.OPEN(src_loc, DBMS_LOB.LOB_READONLY); DBMS_LOB.OPEN(dest_loc, DBMS_LOB.LOB_READWRITE); DBMS_LOB.LOADFROMFILE( dest_lob => dest_loc, src_lob => src_loc, amount => DBMS_LOB.getLength(src_loc));
DBMS_LOB.CLOSE(dest_loc); DBMS_LOB.CLOSE(src_loc); COMMIT; END; ******************* ******write_blob_to_file.sql ************************************** CREATE OR REPLACE PROCEDURE Write_BLOB_To_File AS
v_lob_loc BLOB; v_buffer RAW(32767); v_buffer_size BINARY_INTEGER; v_amount BINARY_INTEGER; v_offset NUMBER(38) := 1; v_chunksize INTEGER; v_out_file UTL_FILE.FILE_TYPE;
BEGIN SELECT image INTO v_lob_loc FROM test_blob WHERE id = 1001; v_chunksize := DBMS_LOB.GETCHUNKSIZE(v_lob_loc); IF (v_chunksize < 32767) THEN v_buffer_size := v_chunksize; ELSE v_buffer_size := 32767;
END IF;
v_out_file := UTL_FILE.FOPEN( location => 'EXAMPLE_LOB_DIR', filename => 'oracle9i_logo2.gif', open_mode => 'w', max_linesize => 32767);
WHILE v_amount >= v_buffer_size LOOP DBMS_LOB.READ( lob_loc => v_lob_loc, amount => v_amount, offset => v_offset, buffer => v_buffer); v_offset := v_offset + v_amount;
UTL_FILE.PUT_RAW (file => v_out_file, buffer => v_buffer, autoflush =>true); UTL_FILE.FFLUSH(file => v_out_file); END LOOP;
OUTPUT:SQL> exec Write_BLOB_To_File PL/SQL procedure successfully completed.SQL> SELECT id, file_name, DBMS_LOB.GETLENGTH(image) Length, timestamp id FROM test_blob; ID FILE_NAME LENGTH TIMESTAMP -------------------------------------------------------------------------------------------1001 4.gif 30849 18-SEP-12 SQL> host ls -l oracle9i_logo* -rw-r--r-- 1 oracle dba 1321 Jul 21 21:27 oracle9i_logo.gif -rw-r--r-- 1 oracle dba 1322 Jul 23 20:27 oracle9i_logo2.gif
create directory filesdir as 'c:\oracle'; grant read on directory filesdir to public; grant write on directory filesdir to public;
Reading NAMES.TXT
DECLARE line VARCHAR2(100); namesfile UTL_FILE.FILE_TYPE; BEGIN -- Syntax : FOPEN ( directory alias, filename, open mode) namesfile := UTL_FILE.FOPEN('FILESDIR','NAMES.TXT','R'); -- open in read mode LOOP -- read a line from NAMES.TXT -- NO_DATA_FOUND exception occurs when you reach end of file -- Syntax : GET_LINE( filename, variable , max length) UTL_FILE.GET_LINE(namesfile,line,100); insert into names values( line); -- insert into NAMES table END LOOP; EXCEPTION WHEN OTHERS THEN UTL_FILE.FCLOSE(namesfile); -- close file WHEN OTHERS THEN dbms_output END;
SQLERRM);