Postgres Plus Advanced Server Oracle Compatibility Developer's Guide
7.10 UTL_FILE
The UTL_FILE package provides the capability to read from, and write to files on the operating system’s file system. Non-superusers must be granted EXECUTE privilege on the UTL_FILE package by a superuser before using any of the functions or procedures in the package. For example the following command grants the privilege to user mary:
GRANT EXECUTE ON PACKAGE SYS.UTL_FILE TO mary;
Also, the operating system username, enterprisedb, must have the appropriate read and/or write permissions on the directories and files to be accessed using the UTL_FILE functions and procedures. If the required file permissions are not in place, an exception is thrown in the UTL_FILE function or procedure.
A handle to the file to be written to, or read from is used to reference the file. The file handle is defined by a public variable in the UTL_FILE package named, UTL_FILE.FILE_TYPE. A variable of type FILE_TYPE must be declared to receive the file handle returned by calling the FOPEN function. The file handle is then used for all subsequent operations on the file.
References to directories on the file system are done using the directory name or alias that is assigned to the directory using the CREATE DIRECTORY command. The procedures and functions available in the UTL_FILE package are listed in the following table.
Table 7-7-18 UTL_FILE Functions/Procedures
Function/Procedure |
Return Type |
Description |
FCLOSE(file IN OUT) |
n/a |
Closes the specified file identified by file. |
FCLOSE_ALL |
n/a |
Closes all open files. |
FCOPY(location, filename, dest_dir, dest_file [, start_line [, end_line ] ]) |
n/a |
Copies filename in the directory identified by location to file, dest_file, in directory, dest_dir, starting from line, start_line, to line, end_line. |
FFLUSH(file) |
n/a |
Forces data in the buffer to be written to disk in the file identified by file. |
FOPEN(location, filename, open_mode [, max_linesize ]) |
FILE_TYPE |
Opens file, filename, in the directory identified by location. |
FREMOVE(location, filename) |
n/a |
Removes the specified file from the file system. |
FRENAME(location, filename, dest_dir, dest_file [, overwrite ]) |
n/a |
Renames the specified file. |
GET_LINE(file, buffer OUT) |
n/a |
Reads a line of text into variable, buffer, from the file identified by file. |
IS_OPEN(file) |
BOOLEAN |
Determines whether or not the given file is open. |
NEW_LINE(file [, lines ]) |
n/a |
Writes an end-of-line character sequence into the file. |
PUT(file, buffer) |
n/a |
Writes buffer to the given file. PUT does not write an end-of-line character sequence. |
PUT_LINE(file, buffer) |
n/a |
Writes buffer to the given file. An end-of-line character sequence is added by the PUT_LINE procedure. |
PUTF(file, format [, arg1 ] [, ...]) |
n/a |
Writes a formatted string to the given file. Up to five substitution parameters, arg1,...arg5 may be specified for replacement in format. |
7.10.1 FCLOSE
The FCLOSE procedure closes an open file.
FCLOSE(file IN OUT FILE_TYPE)
Parameters
file
Variable of type FILE_TYPE containing a file handle of the file to be closed.
7.10.2 FCLOSE_ALL
The FLCLOSE_ALL procedures closes all open files. The procedure executes successfully even if there are no open files to close.
FCLOSE_ALL
7.10.3 FCOPY
The FCOPY procedure copies text from one file to another.
FCOPY(location VARCHAR2, filename VARCHAR2, dest_dir VARCHAR2, dest_file VARCHAR2 [, start_line PLS_INTEGER [, end_line PLS_INTEGER ] ])
Parameters
location
Directory name, as stored in pg_catalog.edb_dir.dirname, of the directory containing the file to be copied.
filename
Name of the source file to be copied.
dest_dir
Directory name, as stored in pg_catalog.edb_dir.dirname, of the directory to which the file is to be copied.
dest_file
Name of the destination file.
start_line
Line number in the source file from which copying will begin. The default is 1.
end_line
Line number of the last line in the source file to be copied. If omitted or null, copying will go to the last line of the file.
Examples
The following makes a copy of a file, C:\TEMP\EMPDIR\empfile.csv, containing a comma-delimited list of employees from the emp table. The copy, empcopy.csv, is then listed.
CREATE DIRECTORY empdir AS 'C:/TEMP/EMPDIR';
DECLARE
v_empfile UTL_FILE.FILE_TYPE;
v_src_dir VARCHAR2(50) := 'empdir';
v_src_file VARCHAR2(20) := 'empfile.csv';
v_dest_dir VARCHAR2(50) := 'empdir';
v_dest_file VARCHAR2(20) := 'empcopy.csv';
v_emprec VARCHAR2(120);
v_count INTEGER := 0;
BEGIN
UTL_FILE.FCOPY(v_src_dir,v_src_file,v_dest_dir,v_dest_file);
v_empfile := UTL_FILE.FOPEN(v_dest_dir,v_dest_file,'r');
DBMS_OUTPUT.PUT_LINE('The following is the destination file, ''' ||
v_dest_file || '''');
LOOP
UTL_FILE.GET_LINE(v_empfile,v_emprec);
DBMS_OUTPUT.PUT_LINE(v_emprec);
v_count := v_count + 1;
END LOOP;
EXCEPTION
WHEN NO_DATA_FOUND THEN
UTL_FILE.FCLOSE(v_empfile);
DBMS_OUTPUT.PUT_LINE(v_count || ' records retrieved');
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('SQLERRM: ' || SQLERRM);
DBMS_OUTPUT.PUT_LINE('SQLCODE: ' || SQLCODE);
END;
The following is the destination file, 'empcopy.csv'
7369,SMITH,CLERK,7902,17-DEC-80,800,,20
7499,ALLEN,SALESMAN,7698,20-FEB-81,1600,300,30
7521,WARD,SALESMAN,7698,22-FEB-81,1250,500,30
7566,JONES,MANAGER,7839,02-APR-81,2975,,20
7654,MARTIN,SALESMAN,7698,28-SEP-81,1250,1400,30
7698,BLAKE,MANAGER,7839,01-MAY-81,2850,,30
7782,CLARK,MANAGER,7839,09-JUN-81,2450,,10
7788,SCOTT,ANALYST,7566,19-APR-87,3000,,20
7839,KING,PRESIDENT,,17-NOV-81,5000,,10
7844,TURNER,SALESMAN,7698,08-SEP-81,1500,0,30
7876,ADAMS,CLERK,7788,23-MAY-87,1100,,20
7900,JAMES,CLERK,7698,03-DEC-81,950,,30
7902,FORD,ANALYST,7566,03-DEC-81,3000,,20
7934,MILLER,CLERK,7782,23-JAN-82,1300,,10
14 records retrieved
7.10.4 FFLUSH
The FFLUSH procedure flushes unwritten data from the write buffer to the file.
FFLUSH(file FILE_TYPE)
Parameters
file
Variable of type FILE_TYPE containing a file handle.
Examples
Each line is flushed after the NEW_LINE procedure is called.
DECLARE
v_empfile UTL_FILE.FILE_TYPE;
v_directory VARCHAR2(50) := 'empdir';
v_filename VARCHAR2(20) := 'empfile.csv';
CURSOR emp_cur IS SELECT * FROM emp ORDER BY empno;
BEGIN
v_empfile := UTL_FILE.FOPEN(v_directory,v_filename,'w');
FOR i IN emp_cur LOOP
UTL_FILE.PUT(v_empfile,i.empno);
UTL_FILE.PUT(v_empfile,',');
UTL_FILE.PUT(v_empfile,i.ename);
UTL_FILE.PUT(v_empfile,',');
UTL_FILE.PUT(v_empfile,i.job);
UTL_FILE.PUT(v_empfile,',');
UTL_FILE.PUT(v_empfile,i.mgr);
UTL_FILE.PUT(v_empfile,',');
UTL_FILE.PUT(v_empfile,i.hiredate);
UTL_FILE.PUT(v_empfile,',');
UTL_FILE.PUT(v_empfile,i.sal);
UTL_FILE.PUT(v_empfile,',');
UTL_FILE.PUT(v_empfile,i.comm);
UTL_FILE.PUT(v_empfile,',');
UTL_FILE.PUT(v_empfile,i.deptno);
UTL_FILE.NEW_LINE(v_empfile);
UTL_FILE.FFLUSH(v_empfile);
END LOOP;
DBMS_OUTPUT.PUT_LINE('Created file: ' || v_filename);
UTL_FILE.FCLOSE(v_empfile);
END;
7.10.5 FOPEN
The FOPEN function opens a file for I/O.
filetype FILE_TYPE FOPEN(location VARCHAR2, filename VARCHAR2, open_mode VARCHAR2 [, max_linesize BINARY_INTEGER ])
Parameters
location
Directory name, as stored in pg_catalog.edb_dir.dirname, of the directory containing the file to be opened.
filename
Name of the file to be opened.
open_mode
Mode in which the file will be opened. Modes are: a - append to file; r - read from file; w - write to file.
max_linesize
Maximum size of a line in characters. In read mode, an exception is thrown if an attempt is made to read a line exceeding max_linesize. In write and append modes, an exception is thrown if an attempt is made to write a line exceeding max_linesize. The end-of-line character(s) are not included in determining if the maximum line size is exceeded. This behavior is not Oracle compatible - Oracle does count the end-of-line character(s).
filetype
Variable of type FILE_TYPE containing the file handle of the opened file.
7.10.6 FREMOVE
The FREMOVE procedure removes a file from the system.
FREMOVE(location VARCHAR2, filename VARCHAR2)
An exception is thrown if the file to be removed does not exist.
Parameters
location
Directory name, as stored in pg_catalog.edb_dir.dirname, of the directory containing the file to be removed.
filename
Name of the file to be removed.
Examples
The following removes file empfile.csv.
DECLARE
v_directory VARCHAR2(50) := 'empdir';
v_filename VARCHAR2(20) := 'empfile.csv';
BEGIN
UTL_FILE.FREMOVE(v_directory,v_filename);
DBMS_OUTPUT.PUT_LINE('Removed file: ' || v_filename);
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('SQLERRM: ' || SQLERRM);
DBMS_OUTPUT.PUT_LINE('SQLCODE: ' || SQLCODE);
END;
Removed file: empfile.csv
7.10.7 FRENAME
The FRENAME procedure renames a given file. This effectively moves a file from one location to another.
FRENAME(location VARCHAR2, filename VARCHAR2, dest_dir VARCHAR2, dest_file VARCHAR2, [ overwrite BOOLEAN ])
Parameters
location
Directory name, as stored in pg_catalog.edb_dir.dirname, of the directory containing the file to be renamed.
filename
Name of the source file to be renamed.
dest_dir
Directory name, as stored in pg_catalog.edb_dir.dirname, of the directory to which the renamed file is to exist.
dest_file
New name of the original file.
overwrite
Replaces any existing file named dest_file in dest_dir if set to TRUE, otherwise an exception is thrown if set to FALSE. This is the default.
Examples
The following renames a file, C:\TEMP\EMPDIR\empfile.csv, containing a comma-delimited list of employees from the emp table. The renamed file, C:\TEMP\NEWDIR\newemp.csv, is then listed.
CREATE DIRECTORY "newdir" AS 'C:/TEMP/NEWDIR';
DECLARE
v_empfile UTL_FILE.FILE_TYPE;
v_src_dir VARCHAR2(50) := 'empdir';
v_src_file VARCHAR2(20) := 'empfile.csv';
v_dest_dir VARCHAR2(50) := 'newdir';
v_dest_file VARCHAR2(50) := 'newemp.csv';
v_replace BOOLEAN := FALSE;
v_emprec VARCHAR2(120);
v_count INTEGER := 0;
BEGIN
UTL_FILE.FRENAME(v_src_dir,v_src_file,v_dest_dir,
v_dest_file,v_replace);
v_empfile := UTL_FILE.FOPEN(v_dest_dir,v_dest_file,'r');
DBMS_OUTPUT.PUT_LINE('The following is the renamed file, ''' ||
v_dest_file || '''');
LOOP
UTL_FILE.GET_LINE(v_empfile,v_emprec);
DBMS_OUTPUT.PUT_LINE(v_emprec);
v_count := v_count + 1;
END LOOP;
EXCEPTION
WHEN NO_DATA_FOUND THEN
UTL_FILE.FCLOSE(v_empfile);
DBMS_OUTPUT.PUT_LINE(v_count || ' records retrieved');
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('SQLERRM: ' || SQLERRM);
DBMS_OUTPUT.PUT_LINE('SQLCODE: ' || SQLCODE);
END;
The following is the renamed file, 'newemp.csv'
7369,SMITH,CLERK,7902,17-DEC-80 00:00:00,800.00,,20
7499,ALLEN,SALESMAN,7698,20-FEB-81 00:00:00,1600.00,300.00,30
7521,WARD,SALESMAN,7698,22-FEB-81 00:00:00,1250.00,500.00,30
7566,JONES,MANAGER,7839,02-APR-81 00:00:00,2975.00,,20
7654,MARTIN,SALESMAN,7698,28-SEP-81 00:00:00,1250.00,1400.00,30
7698,BLAKE,MANAGER,7839,01-MAY-81 00:00:00,2850.00,,30
7782,CLARK,MANAGER,7839,09-JUN-81 00:00:00,2450.00,,10
7788,SCOTT,ANALYST,7566,19-APR-87 00:00:00,3000.00,,20
7839,KING,PRESIDENT,,17-NOV-81 00:00:00,5000.00,,10
7844,TURNER,SALESMAN,7698,08-SEP-81 00:00:00,1500.00,0.00,30
7876,ADAMS,CLERK,7788,23-MAY-87 00:00:00,1100.00,,20
7900,JAMES,CLERK,7698,03-DEC-81 00:00:00,950.00,,30
7902,FORD,ANALYST,7566,03-DEC-81 00:00:00,3000.00,,20
7934,MILLER,CLERK,7782,23-JAN-82 00:00:00,1300.00,,10
14 records retrieved
7.10.8 GET_LINE
The GET_LINE procedure reads a line of text from a given file up to, but not including the end-of-line terminator. A NO_DATA_FOUND exception is thrown when there are no more lines to read.
GET_LINE(file FILE_TYPE, buffer OUT VARCHAR2)
Parameters
file
Variable of type FILE_TYPE containing the file handle of the opened file.
buffer
Variable to receive a line from the file.
Examples
The following anonymous block reads through and displays the records in file empfile.csv.
DECLARE
v_empfile UTL_FILE.FILE_TYPE;
v_directory VARCHAR2(50) := 'empdir';
v_filename VARCHAR2(20) := 'empfile.csv';
v_emprec VARCHAR2(120);
v_count INTEGER := 0;
BEGIN
v_empfile := UTL_FILE.FOPEN(v_directory,v_filename,'r');
LOOP
UTL_FILE.GET_LINE(v_empfile,v_emprec);
DBMS_OUTPUT.PUT_LINE(v_emprec);
v_count := v_count + 1;
END LOOP;
EXCEPTION
WHEN NO_DATA_FOUND THEN
UTL_FILE.FCLOSE(v_empfile);
DBMS_OUTPUT.PUT_LINE('End of file ' || v_filename || ' - ' ||
v_count || ' records retrieved');
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('SQLERRM: ' || SQLERRM);
DBMS_OUTPUT.PUT_LINE('SQLCODE: ' || SQLCODE);
END;
7369,SMITH,CLERK,7902,17-DEC-80 00:00:00,800.00,,20
7499,ALLEN,SALESMAN,7698,20-FEB-81 00:00:00,1600.00,300.00,30
7521,WARD,SALESMAN,7698,22-FEB-81 00:00:00,1250.00,500.00,30
7566,JONES,MANAGER,7839,02-APR-81 00:00:00,2975.00,,20
7654,MARTIN,SALESMAN,7698,28-SEP-81 00:00:00,1250.00,1400.00,30
7698,BLAKE,MANAGER,7839,01-MAY-81 00:00:00,2850.00,,30
7782,CLARK,MANAGER,7839,09-JUN-81 00:00:00,2450.00,,10
7788,SCOTT,ANALYST,7566,19-APR-87 00:00:00,3000.00,,20
7839,KING,PRESIDENT,,17-NOV-81 00:00:00,5000.00,,10
7844,TURNER,SALESMAN,7698,08-SEP-81 00:00:00,1500.00,0.00,30
7876,ADAMS,CLERK,7788,23-MAY-87 00:00:00,1100.00,,20
7900,JAMES,CLERK,7698,03-DEC-81 00:00:00,950.00,,30
7902,FORD,ANALYST,7566,03-DEC-81 00:00:00,3000.00,,20
7934,MILLER,CLERK,7782,23-JAN-82 00:00:00,1300.00,,10
End of file empfile.csv - 14 records retrieved
7.10.9 IS_OPEN
The IS_OPEN function determines whether or not the given file is open.
status BOOLEAN IS_OPEN(file FILE_TYPE)
Parameters
file
Variable of type FILE_TYPE containing the file handle of the file to be tested.
status
TRUE if the given file is open, FALSE otherwise.
7.10.10 NEW_LINE
The NEW_LINE procedure writes an end-of-line character sequence in the file.
NEW_LINE(file FILE_TYPE [, lines INTEGER ])
Parameters
file
Variable of type FILE_TYPE containing the file handle of the file to which end-of-line character sequences are to be written.
lines
Number of end-of-line character sequences to be written. The default is one.
Examples
A file containing a double-spaced list of employee records is written.
DECLARE
v_empfile UTL_FILE.FILE_TYPE;
v_directory VARCHAR2(50) := 'empdir';
v_filename VARCHAR2(20) := 'empfile.csv';
CURSOR emp_cur IS SELECT * FROM emp ORDER BY empno;
BEGIN
v_empfile := UTL_FILE.FOPEN(v_directory,v_filename,'w');
FOR i IN emp_cur LOOP
UTL_FILE.PUT(v_empfile,i.empno);
UTL_FILE.PUT(v_empfile,',');
UTL_FILE.PUT(v_empfile,i.ename);
UTL_FILE.PUT(v_empfile,',');
UTL_FILE.PUT(v_empfile,i.job);
UTL_FILE.PUT(v_empfile,',');
UTL_FILE.PUT(v_empfile,i.mgr);
UTL_FILE.PUT(v_empfile,',');
UTL_FILE.PUT(v_empfile,i.hiredate);
UTL_FILE.PUT(v_empfile,',');
UTL_FILE.PUT(v_empfile,i.sal);
UTL_FILE.PUT(v_empfile,',');
UTL_FILE.PUT(v_empfile,i.comm);
UTL_FILE.PUT(v_empfile,',');
UTL_FILE.PUT(v_empfile,i.deptno);
UTL_FILE.NEW_LINE(v_empfile,2);
END LOOP;
DBMS_OUTPUT.PUT_LINE('Created file: ' || v_filename);
UTL_FILE.FCLOSE(v_empfile);
END;
Created file: empfile.csv
This file is then displayed:
C:\TEMP\EMPDIR>TYPE empfile.csv 7369,SMITH,CLERK,7902,17-DEC-80 00:00:00,800.00,,20 7499,ALLEN,SALESMAN,7698,20-FEB-81 00:00:00,1600.00,300.00,30 7521,WARD,SALESMAN,7698,22-FEB-81 00:00:00,1250.00,500.00,30 7566,JONES,MANAGER,7839,02-APR-81 00:00:00,2975.00,,20 7654,MARTIN,SALESMAN,7698,28-SEP-81 00:00:00,1250.00,1400.00,30 7698,BLAKE,MANAGER,7839,01-MAY-81 00:00:00,2850.00,,30 7782,CLARK,MANAGER,7839,09-JUN-81 00:00:00,2450.00,,10 7788,SCOTT,ANALYST,7566,19-APR-87 00:00:00,3000.00,,20 7839,KING,PRESIDENT,,17-NOV-81 00:00:00,5000.00,,10 7844,TURNER,SALESMAN,7698,08-SEP-81 00:00:00,1500.00,0.00,30 7876,ADAMS,CLERK,7788,23-MAY-87 00:00:00,1100.00,,20 7900,JAMES,CLERK,7698,03-DEC-81 00:00:00,950.00,,30 7902,FORD,ANALYST,7566,03-DEC-81 00:00:00,3000.00,,20 7934,MILLER,CLERK,7782,23-JAN-82 00:00:00,1300.00,,10
7.10.11 PUT
The PUT procedure writes a string to the given file. No end-of-line character sequence is written at the end of the string. Use the NEW_LINE procedure to add an end-of-line character sequence.
PUT(file FILE_TYPE, buffer { DATE | NUMBER | TIMESTAMP |
VARCHAR2 })
Parameters
file
Variable of type FILE_TYPE containing the file handle of the file to which the given string is to be written.
buffer
Text to be written to the specified file.
Examples
The following example uses the PUT procedure to create a comma-delimited file of employees from the emp table.
DECLARE
v_empfile UTL_FILE.FILE_TYPE;
v_directory VARCHAR2(50) := 'empdir';
v_filename VARCHAR2(20) := 'empfile.csv';
CURSOR emp_cur IS SELECT * FROM emp ORDER BY empno;
BEGIN
v_empfile := UTL_FILE.FOPEN(v_directory,v_filename,'w');
FOR i IN emp_cur LOOP
UTL_FILE.PUT(v_empfile,i.empno);
UTL_FILE.PUT(v_empfile,',');
UTL_FILE.PUT(v_empfile,i.ename);
UTL_FILE.PUT(v_empfile,',');
UTL_FILE.PUT(v_empfile,i.job);
UTL_FILE.PUT(v_empfile,',');
UTL_FILE.PUT(v_empfile,i.mgr);
UTL_FILE.PUT(v_empfile,',');
UTL_FILE.PUT(v_empfile,i.hiredate);
UTL_FILE.PUT(v_empfile,',');
UTL_FILE.PUT(v_empfile,i.sal);
UTL_FILE.PUT(v_empfile,',');
UTL_FILE.PUT(v_empfile,i.comm);
UTL_FILE.PUT(v_empfile,',');
UTL_FILE.PUT(v_empfile,i.deptno);
UTL_FILE.NEW_LINE(v_empfile);
END LOOP;
DBMS_OUTPUT.PUT_LINE('Created file: ' || v_filename);
UTL_FILE.FCLOSE(v_empfile);
END;
Created file: empfile.csv
The following is the contents of empfile.csv created above:
C:\TEMP\EMPDIR>TYPE empfile.csv 7369,SMITH,CLERK,7902,17-DEC-80 00:00:00,800.00,,20 7499,ALLEN,SALESMAN,7698,20-FEB-81 00:00:00,1600.00,300.00,30 7521,WARD,SALESMAN,7698,22-FEB-81 00:00:00,1250.00,500.00,30 7566,JONES,MANAGER,7839,02-APR-81 00:00:00,2975.00,,20 7654,MARTIN,SALESMAN,7698,28-SEP-81 00:00:00,1250.00,1400.00,30 7698,BLAKE,MANAGER,7839,01-MAY-81 00:00:00,2850.00,,30 7782,CLARK,MANAGER,7839,09-JUN-81 00:00:00,2450.00,,10 7788,SCOTT,ANALYST,7566,19-APR-87 00:00:00,3000.00,,20 7839,KING,PRESIDENT,,17-NOV-81 00:00:00,5000.00,,10 7844,TURNER,SALESMAN,7698,08-SEP-81 00:00:00,1500.00,0.00,30 7876,ADAMS,CLERK,7788,23-MAY-87 00:00:00,1100.00,,20 7900,JAMES,CLERK,7698,03-DEC-81 00:00:00,950.00,,30 7902,FORD,ANALYST,7566,03-DEC-81 00:00:00,3000.00,,20 7934,MILLER,CLERK,7782,23-JAN-82 00:00:00,1300.00,,10
7.10.12 PUT_LINE
The PUT_LINE procedure writes a single line to the given file including an end-of-line character sequence.
PUT_LINE(file FILE_TYPE, buffer { DATE | NUMBER | TIMESTAMP |
VARCHAR2 })
Parameters
file
Variable of type FILE_TYPE containing the file handle of the file to which the given line is to be written.
buffer
Text to be written to the specified file.
Examples
The following example uses the PUT_LINE procedure to create a comma-delimited file of employees from the emp table.
DECLARE
v_empfile UTL_FILE.FILE_TYPE;
v_directory VARCHAR2(50) := 'empdir';
v_filename VARCHAR2(20) := 'empfile.csv';
v_emprec VARCHAR2(120);
CURSOR emp_cur IS SELECT * FROM emp ORDER BY empno;
BEGIN
v_empfile := UTL_FILE.FOPEN(v_directory,v_filename,'w');
FOR i IN emp_cur LOOP
v_emprec := i.empno || ',' || i.ename || ',' || i.job || ',' ||
NVL(LTRIM(TO_CHAR(i.mgr,'9999')),'') || ',' || i.hiredate ||
',' || i.sal || ',' ||
NVL(LTRIM(TO_CHAR(i.comm,'9990.99')),'') || ',' || i.deptno;
UTL_FILE.PUT_LINE(v_empfile,v_emprec);
END LOOP;
DBMS_OUTPUT.PUT_LINE('Created file: ' || v_filename);
UTL_FILE.FCLOSE(v_empfile);
END;
The following is the contents of empfile.csv created above:
C:\TEMP\EMPDIR>TYPE empfile.csv 7369,SMITH,CLERK,7902,17-DEC-80 00:00:00,800.00,,20 7499,ALLEN,SALESMAN,7698,20-FEB-81 00:00:00,1600.00,300.00,30 7521,WARD,SALESMAN,7698,22-FEB-81 00:00:00,1250.00,500.00,30 7566,JONES,MANAGER,7839,02-APR-81 00:00:00,2975.00,,20 7654,MARTIN,SALESMAN,7698,28-SEP-81 00:00:00,1250.00,1400.00,30 7698,BLAKE,MANAGER,7839,01-MAY-81 00:00:00,2850.00,,30 7782,CLARK,MANAGER,7839,09-JUN-81 00:00:00,2450.00,,10 7788,SCOTT,ANALYST,7566,19-APR-87 00:00:00,3000.00,,20 7839,KING,PRESIDENT,,17-NOV-81 00:00:00,5000.00,,10 7844,TURNER,SALESMAN,7698,08-SEP-81 00:00:00,1500.00,0.00,30 7876,ADAMS,CLERK,7788,23-MAY-87 00:00:00,1100.00,,20 7900,JAMES,CLERK,7698,03-DEC-81 00:00:00,950.00,,30 7902,FORD,ANALYST,7566,03-DEC-81 00:00:00,3000.00,,20 7934,MILLER,CLERK,7782,23-JAN-82 00:00:00,1300.00,,10
7.10.13 PUTF
The PUTF procedure writes a formatted string to the given file.
PUTF(file FILE_TYPE, format VARCHAR2 [, arg1 VARCHAR2] [, ...])
Parameters
file
Variable of type FILE_TYPE containing the file handle of the file to which the formatted line is to be written.
format
String to format the text written to the file. The special character sequence, %s, is substituted by the value of arg. The special character sequence, \n, indicates a new line. Note, however, in Postgres Plus Advanced Server, a new line character must be specified with two consecutive backslashes instead of one - \\n. This characteristic is not Oracle compatible.
arg1
Up to five arguments, arg1,...arg5, to be substituted in the format string for each occurrence of %s. The first arg is substituted for the first occurrence of %s, the second arg is substituted for the second occurrence of %s, etc.
Examples
The following anonymous block produces formatted output containing data from the emp table. Note the use of the E literal syntax and double backslashes for the new line character sequence in the format string which are not Oracle compatible.
DECLARE
v_empfile UTL_FILE.FILE_TYPE;
v_directory VARCHAR2(50) := 'empdir';
v_filename VARCHAR2(20) := 'empfile.csv';
v_format VARCHAR2(200);
CURSOR emp_cur IS SELECT * FROM emp ORDER BY empno;
BEGIN
v_format := E'%s %s, %s\\nSalary: $%s Commission: $%s\\n\\n';
v_empfile := UTL_FILE.FOPEN(v_directory,v_filename,'w');
FOR i IN emp_cur LOOP
UTL_FILE.PUTF(v_empfile,v_format,i.empno,i.ename,i.job,i.sal,
NVL(i.comm,0));
END LOOP;
DBMS_OUTPUT.PUT_LINE('Created file: ' || v_filename);
UTL_FILE.FCLOSE(v_empfile);
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('SQLERRM: ' || SQLERRM);
DBMS_OUTPUT.PUT_LINE('SQLCODE: ' || SQLCODE);
END;
Created file: empfile.csv
The following is the contents of empfile.csv created above:
C:\TEMP\EMPDIR>TYPE empfile.csv 7369 SMITH, CLERK Salary: $800.00 Commission: $0 7499 ALLEN, SALESMAN Salary: $1600.00 Commission: $300.00 7521 WARD, SALESMAN Salary: $1250.00 Commission: $500.00 7566 JONES, MANAGER Salary: $2975.00 Commission: $0 7654 MARTIN, SALESMAN Salary: $1250.00 Commission: $1400.00 7698 BLAKE, MANAGER Salary: $2850.00 Commission: $0 7782 CLARK, MANAGER Salary: $2450.00 Commission: $0 7788 SCOTT, ANALYST Salary: $3000.00 Commission: $0 7839 KING, PRESIDENT Salary: $5000.00 Commission: $0 7844 TURNER, SALESMAN Salary: $1500.00 Commission: $0.00 7876 ADAMS, CLERK Salary: $1100.00 Commission: $0 7900 JAMES, CLERK Salary: $950.00 Commission: $0 7902 FORD, ANALYST Salary: $3000.00 Commission: $0 7934 MILLER, CLERK Salary: $1300.00 Commission: $0







