Sunteți pe pagina 1din 6

CONNECT SYS PASSWORD: PASSWORD AS SYSDBA CREATE OR REPLACE DIRECTORY EXAMPLE_LOB_DIR AS 'C:\ORACLE GRANT READ,WRITE ON DIRECTORY EXAMPLE_LOB_DIR TO PUBLIC;

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_amount := v_buffer_size; DBMS_LOB.OPEN(v_lob_loc, DBMS_LOB.LOB_READONLY);

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;

UTL_FILE.FFLUSH(file => v_out_file); UTL_FILE.FCLOSE(v_out_file); DBMS_LOB.CLOSE(v_lob_loc); END;

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

connect sys/password as sysdba

grant execute on UTL_FILE to public;

create directory filesdir as 'c:\oracle'; grant read on directory filesdir to public; grant write on directory filesdir to public;

connect hr/hr; create table names ( name varchar2(30) );

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;

Writing into JOBS.TXT


DECLARE JOBSFILE UTL_FILE.FILE_TYPE; -- TAKE ALL JOB TITLES FROM JOBS CURSOR JOBSCUR IS SELECT JOB_TITLE FROM JOBS ORDER BY JOB_TITLE; BEGIN -- OPEN FILE FOR WRITING JOBSFILE := UTL_FILE.FOPEN('FILESDIR','JOBS.TXT','W'); -- TAKE ONE RECORD FROM CURSOR FOR REC IN JOBSCUR LOOP UTL_FILE.PUT_LINE(JOBSFILE, REC.JOB_TITLE); END LOOP; UTL_FILE.FCLOSE(JOBSFILE); -- CLOSE FILE

-- WRITE INTO FILE

EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE( 'ERROR -->' || END;

SQLERRM);

S-ar putea să vă placă și