CREATE OR REPLACE PACKAGE SYS.utl_file AUTHID CURRENT_USER AS
/* FILE_TYPE - File handle */
--utl_file包的操作都需要指定一个file_type型的对象(用FOPEN来装入)
TYPE file_type IS RECORD (id BINARY_INTEGER ,
datatype BINARY_INTEGER ,
byte_mode BOOLEAN );
/* Exceptions */
file_open EXCEPTION ;--打开请求失败,文件已经被打开
charsetmismatch EXCEPTION ;--文件使用FOPEN_NCHAR打开,但是进行了nonchar操作(如PUTF/GET_LINE)
invalid_path EXCEPTION ;--错误的路径
invalid_mode EXCEPTION ;--提供了FOPEN不支持的打开模式
invalid_filehandle EXCEPTION ;--文件处理错误
invalid_operation EXCEPTION ;--文件无法打开
read_error EXCEPTION ;--在read时发生操作系统错误
write_error EXCEPTION ;--在write时发生操作系统错误
internal_error EXCEPTION ;--未指定的PLSQL错误
invalid_maxlinesize EXCEPTION ;--FOPEN的最大行定义错误(必须在1到32767之间)
invalid_filename EXCEPTION ;--文件名错误,或无法找到
access_denied EXCEPTION ;--无法进入指定路径
invalid_offset EXCEPTION ;--比较复杂,不管了
delete_failed EXCEPTION ;--删除操作发生错误
rename_failed EXCEPTION ;--重命名操作发生错误
--以下都是自己定义的Exception Errcode.
charsetmismatch_errcode CONSTANT PLS_INTEGER := - 29298 ;
invalid_path_errcode CONSTANT PLS_INTEGER := - 29280 ;
invalid_mode_errcode CONSTANT PLS_INTEGER := - 29281 ;
invalid_filehandle_errcode CONSTANT PLS_INTEGER := - 29282 ;
invalid_operation_errcode CONSTANT PLS_INTEGER := - 29283 ;
read_error_errcode CONSTANT PLS_INTEGER := - 29284 ;
write_error_errcode CONSTANT PLS_INTEGER := - 29285 ;
internal_error_errcode CONSTANT PLS_INTEGER := - 29286 ;
invalid_maxlinesize_errcode CONSTANT PLS_INTEGER := - 29287 ;
invalid_filename_errcode CONSTANT PLS_INTEGER := - 29288 ;
access_denied_errcode CONSTANT PLS_INTEGER := - 29289 ;
invalid_offset_errcode CONSTANT PLS_INTEGER := - 29290 ;
delete_failed_errcode CONSTANT PLS_INTEGER := - 29291 ;
rename_failed_errcode CONSTANT PLS_INTEGER := - 29292 ;
--自定义的错误
PRAGMA EXCEPTION_INIT (charsetmismatch, - 29298 );
PRAGMA EXCEPTION_INIT (invalid_path, - 29280 );
PRAGMA EXCEPTION_INIT (invalid_mode, - 29281 );
PRAGMA EXCEPTION_INIT (invalid_filehandle, - 29282 );
PRAGMA EXCEPTION_INIT (invalid_operation, - 29283 );
PRAGMA EXCEPTION_INIT (read_error, - 29284 );
PRAGMA EXCEPTION_INIT (write_error, - 29285 );
PRAGMA EXCEPTION_INIT (internal_error, - 29286 );
PRAGMA EXCEPTION_INIT (invalid_maxlinesize, - 29287 );
PRAGMA EXCEPTION_INIT (invalid_filename, - 29288 );
PRAGMA EXCEPTION_INIT (access_denied, - 29289 );
PRAGMA EXCEPTION_INIT (invalid_offset, - 29290 );
PRAGMA EXCEPTION_INIT (delete_failed, - 29291 );
PRAGMA EXCEPTION_INIT (rename_failed, - 29292 );
/*
** FOPEN - open file
**
** As of 8.0.6, you can have a maximum of 50 files open simultaneously.
**
** As of 9.0.2, UTL_FILE allows file system access for directories
** created as database objects. See the CREATE DIRECTORY command.
** Directory object names are case sensitive and must match exactly
** the NAME string in ALL_DIRECTORIES. The LOCATION parameter may be
** either a directory string from the UTL_FILE_DIR init.ora parameter
** or a directory object name.
**
** IN
** location - directory location of file
** filename - file name (including extention)
** open_mode - open mode ('r', 'w', 'a' 'rb', 'wb', 'ab')
--'r':读文件(清空后再写入)
--'w':写文件
--'a':追加文件(即不删除之前内容)
--'rb':byte mode 读文件(清空后再写入)
--'wb':byte mode 写文件
--'ab':byte mode 追加文件(即不删除之前内容)
** max_linesize - maximum number of characters per line, including the
** newline character, for this file.
** Valid values are 1 through 32767 and NULL. A NULL
** value for max_linesize indicates that UTL_FILE should
** calculate an operating system specific value at runtime.
** RETURN
** file_type handle to open file
** EXCEPTIONS
** invalid_path - file location or name was invalid
** invalid_mode - the open_mode string was invalid
** invalid_operation - file could not be opened as requested
** invalid_maxlinesize - specified max_linesize is too large or too small
** access_denied - access to the directory object is denied
*/
FUNCTION fopen(location IN VARCHAR2 ,
filename IN VARCHAR2 ,
open_mode IN VARCHAR2 ,
max_linesize IN BINARY_INTEGER DEFAULT NULL )
RETURN file_type;
PRAGMA RESTRICT_REFERENCES (fopen, WNDS , RNDS , TRUST );
/*
** FOPEN_NCHAR - open file
**
** Note: since NCHAR contains mutibyte character, it is highly recommended
** that the max_linesize is less than 6400.
*/
FUNCTION fopen_nchar(location IN VARCHAR2 ,
filename IN VARCHAR2 ,
open_mode IN VARCHAR2 ,
max_linesize IN BINARY_INTEGER DEFAULT NULL )
RETURN file_type;
PRAGMA RESTRICT_REFERENCES (fopen_nchar, WNDS , RNDS , TRUST );
/*
** IS_OPEN - Test if file handle is open
**
** IN
** file - File handle
**
** RETURN
** BOOLEAN - Is file handle open/valid?
*/
FUNCTION is_open(file IN file_type) RETURN BOOLEAN ;
PRAGMA RESTRICT_REFERENCES (is_open, WNDS , RNDS , WNPS , RNPS , TRUST );
/*
** FCLOSE - close an open file
**
** IN
** file - File handle (open)
** EXCEPTIONS
** invalid_filehandle - not a valid file handle
** write_error - OS error occured during write operation
*/
PROCEDURE fclose(file IN OUT file_type);
PRAGMA RESTRICT_REFERENCES (fclose, WNDS , RNDS , TRUST );
/*
** FCLOSE_ALL - close all open files for this session
**
** For Emergency/Cleanup use only. FILE_TYPE handles will not be
** cleared (IS_OPEN will still indicate they are valid)
**
** IN
** file - File handle (open)
** EXCEPTIONS
** write_error - OS error occured during write operation
*/
PROCEDURE fclose_all;
PRAGMA RESTRICT_REFERENCES (fclose_all, WNDS , RNDS , TRUST );
/*
** GET_LINE - Get (read) a line of text from the file
**
** IN
** file - File handle (open in read mode)
** len - input buffer length, default is null, max is 32767
** OUT
** buffer - next line of text in file
** EXCEPTIONS
** no_data_found - reached the end of file
** value_error - line to long to store in buffer
** invalid_filehandle - not a valid file handle
** invalid_operation - file is not open for reading
** - file is open for byte mode access
** read_error - OS error occurred during read
** charsetmismatch - if the file is open for nchar data.
*/
--注意这个函数会读取一行一直到line terminator,然后下一次读取时接着下面的内容
--当到达最后一行时返回no_data_found错误
PROCEDURE get_line(file IN file_type,
buffer OUT VARCHAR2 ,
len IN BINARY_INTEGER DEFAULT NULL );
PRAGMA RESTRICT_REFERENCES (get_line, WNDS , RNDS , WNPS , RNPS , TRUST );
/* GET_LINE_NCHAR - Get (read a line of nchar data from the file.
**
** IN
** file - File handle (open in read mode)
** len - input buffer length, default is null, max is 32767
** OUT
** buffer - next line of text in file
** the data might be convert from UTF8 to current charset.
** EXCEPTIONS
** no_data_found - reached the end of file
** value_error - line to long to store in buffer
** invalid_filehandle - not a valid file handle
** invalid_operation - file is not open for reading
** - file is open for byte mode access
** read_error - OS error occurred during read
** charsetmismatch - if the file is open for char data.
*/
PROCEDURE get_line_nchar(file IN file_type,
buffer OUT NVARCHAR2 ,
len IN BINARY_INTEGER DEFAULT NULL );
PRAGMA RESTRICT_REFERENCES (get_line_nchar, WNDS , RNDS , WNPS , TRUST );
/*
** PUT - Put (write) text to file
**
** IN
** file - File handle (open in write/append mode)
** buffer - Text to write
** EXCEPTIONS
** invalid_filehandle - not a valid file handle
** invalid_operation - file is not open for writing/appending
** - file is open for byte mode access
** write_error - OS error occured during write operation
** charsetmismatch - if the file is open for nchar data.
*/
--这个就是没有换行符的PUT_LINE,需要自己加NEW_LINE
PROCEDURE put(file IN file_type,
buffer IN VARCHAR2 );
PRAGMA RESTRICT_REFERENCES (put, WNDS , RNDS , TRUST );
/*
** PUT_NCHAR - Put (write) nchar data to file
** IN
** file - File handle (open in write/append mode)
** buffer - Text to write. the data will convert to UTF8 if needed.
** EXCEPTIONS
** invalid_filehandle - not a valid file handle
** invalid_operation - file is not open for writing/appending
** - file is open for byte mode access
** write_error - OS error occured during write operation
** charsetmismatch - if the file is open for char data.
*/
PROCEDURE put_nchar(file IN file_type,
buffer IN NVARCHAR2 );
PRAGMA RESTRICT_REFERENCES (put_nchar, WNDS , RNDS , TRUST );
/*
** NEW_LINE - Write line terminators to file
**
** IN
** file - File handle (open in write/append mode)
** lines - Number of newlines to write (default 1)
** EXCEPTIONS
** invalid_filehandle - not a valid file handle
** invalid_operation - file is not open for writing/appending
** - file is open for byte mode access
** write_error - OS error occured during write operation
*/
--表示在这个位置插入一个换行符(也可以指定空的行数)
--这个还是比较实用的
PROCEDURE new_line(file IN file_type,
lines IN NATURAL := 1 );
PRAGMA RESTRICT_REFERENCES (new_line, WNDS , RNDS , TRUST );
/*
** PUT_LINE - Put (write) line to file
**
** IN
** file - File handle (open in write/append mode)
** buffer - Text to write.
** autoflush - Flush following write, default=no flush
** EXCEPTIONS
** invalid_filehandle - not a valid file handle
** invalid_operation - file is not open for writing/appending
** - file is open for byte mode access
** write_error - OS error occured during write operation
** charsetmismatch - if the file is open for nchar data.
*/
PROCEDURE put_line(file IN file_type,
buffer IN VARCHAR2 ,
autoflush IN BOOLEAN DEFAULT FALSE );
PRAGMA RESTRICT_REFERENCES (put_line, WNDS , RNDS , TRUST );
/*
** PUT_LINE_NCHAR - Put (write) line of nchar data to file
** IN
** file - File handle (open in write/append mode)
** buffer - Text to write. The data might convert to UTF8 if needed.
** EXCEPTIONS
** invalid_filehandle - not a valid file handle
** invalid_operation - file is not open for writing/appending
** - file is open for byte mode access
** write_error - OS error occured during write operation
** charsetmismatch - if the file is open for char data.
*/
PROCEDURE put_line_nchar(file IN file_type,
buffer IN NVARCHAR2 );
PRAGMA RESTRICT_REFERENCES (put_line_nchar, WNDS , RNDS , TRUST );
/*
** PUTF - Put (write) formatted text to file
**
** Format string special characters
** '%s' - substitute with next argument
** '\n' - newline (line terminator)
**
** IN
** file - File handle (open in write/append mode)
** format - Formatting string
** arg1 - Substitution argument #1
** ...
** EXCEPTIONS
** invalid_filehandle - not a valid file handle
** invalid_operation - file is not open for writing/appending
** - file is open for byte mode access
** write_error - OS error occured during write operation
** charsetmismatch - if the file is open for nchar data.
*/
/***********************************************************************
这是一个输入格式化内容的过程定义,相当于C语言中的printf,具体的可以看下面这个例子:
Hello, world!
I come from Zork with greetings for all earthlings.
my_world varchar2(4) := 'Zork';
...
PUTF(my_handle, 'Hello, world!\nI come from %s with %s.\n',
my_world,
'greetings for all earthlings');
************************************************************************/
procedure putf(file IN file_type,
format IN VARCHAR2 ,
arg1 IN VARCHAR2 DEFAULT NULL ,
arg2 IN VARCHAR2 DEFAULT NULL ,
arg3 IN VARCHAR2 DEFAULT NULL ,
arg4 IN VARCHAR2 DEFAULT NULL ,
arg5 IN VARCHAR2 DEFAULT NULL );
PRAGMA RESTRICT_REFERENCES (putf, WNDS , RNDS , TRUST );
/*
** PUTF_NCHAR - Put (write) formatted text to file
**
** Format string special characters
** N'%s' - substitute with next argument
** N'\n' - newline (line terminator)
**
** IN
** file - File handle (open in write/append mode)
** format - Formatting string
** arg1 - Substitution argument #1
** ...
** EXCEPTIONS
** invalid_filehandle - not a valid file handle
** invalid_operation - file is not open for writing/appending
** - file is open for byte mode access
** write_error - OS error occured during write operation
** charsetmismatch - if the file is open for char data.
*/
procedure putf_nchar(file IN file_type,
format IN NVARCHAR2 ,
arg1 IN NVARCHAR2 DEFAULT NULL ,
arg2 IN NVARCHAR2 DEFAULT NULL ,
arg3 IN NVARCHAR2 DEFAULT NULL ,
arg4 IN NVARCHAR2 DEFAULT NULL ,
arg5 IN NVARCHAR2 DEFAULT NULL );
PRAGMA RESTRICT_REFERENCES (putf_nchar, WNDS , RNDS , TRUST );
/*
** FFLUSH - Force physical write of buffered output
**
** IN
** file - File handle (open in write/append mode)
** EXCEPTIONS
** invalid_filehandle - not a valid file handle
** invalid_operation - file is not open for writing/appending
** write_error - OS error occured during write operation
*/
--FFLUSH是用来手工将buffer中的内容写到文件中的
--特别是在文件依然打开的状态下需要读取的时候,可以FFLUSH之后进行read
PROCEDURE fflush(file IN file_type);
PRAGMA RESTRICT_REFERENCES (fflush, WNDS , RNDS , TRUST );
/*
** PUT_RAW - Write a raw value to file.
**
** IN file - File handle (open in write/append mode)
** IN buffer - Raw data
** IN autoflush - Flush following write, default=no flush
** EXCEPTIONS
** invalid_filehandle - not a valid file handle
** invalid_operation - file is not open for writing/appending
** write_error - OS error occured during write operation
*/
PROCEDURE put_raw(file IN file_type,
buffer IN RAW ,
autoflush IN BOOLEAN DEFAULT FALSE );
PRAGMA RESTRICT_REFERENCES (put_raw, WNDS , RNDS , TRUST );
/*
** GET_RAW - Read a raw value from file.
**
** The GET_RAW() will read until it sees a line termination character
** or until the number of bytes specified in the LEN parameter has been read.
**
** IN file - File handle (open in write/append mode)
** OUT buffer - Raw data
** IN len - Nubmer of bytes to be read
** EXCEPTIONS
** invalid_filehandle - not a valid file handle
** invalid_operation - file is not open for writing/appending
** read_error - OS error occured during read operation
*/
PROCEDURE get_raw(file IN file_type,
buffer OUT NOCOPY RAW ,
len IN BINARY_INTEGER DEFAULT NULL );
PRAGMA RESTRICT_REFERENCES (get_raw, WNDS , RNDS , TRUST );
/*
** FSEEK - Move the file pointer to a specified position within the file.
**
** IN file - File handle (open in write/append mode)
** IN absolute_offset - Absolute offset to which to seek.
** IN relative_offset - Relative offset, forward or backwards, to which
** to seek.
**
** The file must be open in read mode in order to use fseek().
**
** If both absolute_offset and relative_offset are not NULL, absolute_offset
** takes precedence. A negative relative_offset will cause fseek to
** close and reopen the file and seek in a forward direction.
**
** EXCEPTIONS
** invalid_filehandle - not a valid file handle
** invalid_offset - file is not open for writing/appending
** invalid_operation - file is opened for byte mode access
*/
PROCEDURE fseek(file IN OUT file_type,
absolute_offset IN BINARY_INTEGER DEFAULT NULL ,
relative_offset IN BINARY_INTEGER DEFAULT NULL );
PRAGMA RESTRICT_REFERENCES (fseek, WNDS , RNDS , TRUST );
/*
** FREMOVE - Delete the specified file from disk.
**
** IN location - directory location of file
** IN filename - file name (including extention)
** EXCEPTIONS
** invalid_path - not a valid file handle
** invalid_filename - file not found or file name NULL
** file_open - file is not open for writing/appending
** access_denied - access to the directory object is denied
** remove_failed - failed to delete file
*/
--删除文件
PROCEDURE fremove(location IN VARCHAR2 ,
filename IN VARCHAR2 );
PRAGMA RESTRICT_REFERENCES (fremove, WNDS , RNDS , TRUST );
/*
** FCOPY - Copy all or part of a file to a new file.
**
** IN location - source directory of file
** IN filename - source file name (including extention)
** IN dest_dir - destination directory of file
** IN dest_file - destination file name (including extention)
** IN start_line - line number from which to begin copying, default is
** 1 referring to the first line in the file
** IN end_line - line number from which to end copying, default is NULL
** referring to end-of-file
** EXCEPTIONS
** invalid_path - not a valid file handle
** invalid_filename - file not found or file name is NULL
** invalid_lineno - bad start_line or end_line value
*/
PROCEDURE fcopy(src_location IN VARCHAR2 ,
src_filename IN VARCHAR2 ,
dest_location IN VARCHAR2 ,
dest_filename IN VARCHAR2 ,
start_line IN BINARY_INTEGER DEFAULT 1 ,
end_line IN BINARY_INTEGER DEFAULT NULL );
PRAGMA RESTRICT_REFERENCES (fcopy, WNDS , RNDS , TRUST );
/*
** FGETATTR - Get file attributes
**
** IN location - directory location of file
** IN filename - file name (including extention)
** OUT fexists - true or false, for exists or doesn't exist. Note:
** the following parameters have no meaning if the file
** doesn't exist, in which case, they return NULL.
** OUT file_length - length of the file in bytes.
** OUT block_size - filesystem block size in bytes.
** EXCEPTIONS
** invalid_path - not a valid file handle
** invalid_filename - file not found or file name NULL
** file_open - file is not open for writing/appending
** access_denied - access to the directory object is denied
*/
--这个过程是用于获得文件属性的,具体内容上面说的很清楚了
PROCEDURE fgetattr(location IN VARCHAR2 ,
filename IN VARCHAR2 ,
fexists OUT BOOLEAN ,
file_length OUT NUMBER ,
block_size OUT BINARY_INTEGER );
PRAGMA RESTRICT_REFERENCES (fgetattr, WNDS , RNDS , TRUST );
/*
** FGETPOS - Return the current position in the file in bytes.
**
** IN file - File handle (open in write/append mode)
** EXCEPTIONS
** invalid_filehandle - not a valid file handle
** invalid_operation - file is not open for writing/appending
** invalid_operation - file is open for byte mode access
*/
FUNCTION fgetpos(file IN file_type) RETURN BINARY_INTEGER ;
PRAGMA RESTRICT_REFERENCES (fgetpos, WNDS , RNDS , TRUST );
/*
** FRENAME - Rename a file to a new name.
**
** IN location - source directory of file
** IN filename - source file name (including extention)
** IN dest_dir - destination directory of file
** IN dest_file - destination file name (including extention)
** IN overwrite - boolean signifying whether to overwrite an existing
** in the event that one exists, default no overwrite
** EXCEPTIONS
** invalid_path - not a valid file handle
** invalid_filename - file not found or file name NULL
** rename_failed - rename of the file failed
** access_denied - access to the directory object is denied
*/
PROCEDURE frename(src_location IN VARCHAR2 ,
src_filename IN VARCHAR2 ,
dest_location IN VARCHAR2 ,
dest_filename IN VARCHAR2 ,
overwrite IN BOOLEAN DEFAULT FALSE );
PRAGMA RESTRICT_REFERENCES (frename, WNDS , RNDS , TRUST );
END utl_file;