一、说明
UTL_FILE是oracle提供的一个标准的工具包,用来读写文件使用。
二、路径
包UTL_FILE用于读写操作系统的文件,前提是首先创建路径(Directory)并授权。ORACLE目录的作用就是让ORACLE数据库和操作系统之前进行文件的交互。
为了创建目录,必须具有DBA角色或者赋予了CREATE ANY DIRECTORY权限。如果普通用户被赋予了CREATE ANY DIRECTORY权限,那么用户就自动具备目录的READ和WRITE权限
创建:CREATE [OR REPLACE] DIRECTORY directory_name AS 'path_name' ;
create or replace directory DB_OUT as '/usr/local/xilen/DB_OUT';
--路径授权,添加对路径读、写权限
grant read,write on directory DB_OUT to xilen;
--utl_file包授权,添加执行权限
GRANT EXECUTE ON utl_file TO xilen;
-- 限制单列的显示长度
COL DIRECTORY_PATH format a60;
-- 查询路径
SELECT DIRECTORY_NAME, DIRECTORY_PATH, GRANTEE, PRIVILEGE FROM USER_TAB_PRIVS T, ALL_DIRECTORIES D WHERE T.TABLE_NAME(+)=D.DIRECTORY_NAME;
TYPE file_type IS RECORD(
id BINARY_INTEGER,
datatype BINARY_INTEGER
);
UTL_FILE.FOPEN(
location IN VARCHAR2, -- 文件路径(必须要使用DIRECTORY对象,并且其名称必须为大写)
filename IN VARCHAR2, -- 文件名
open_mode IN VARCHAR2, -- 打开模式
max_linesize IN BINARY_INTEGER -- 指定文件每行存放的最大字符数
)
RETURN file_type; -- 预操作文件的指针(句柄)
注:文件的打开模式包含'r', 'w', 'a' 'rb', 'wb', 'ab'六种: 3、IS_OPEN
该函数用于确定文件是否已经被打开,语法如下:
UTL_FILE.IS_OPEN(
file IN FILE_TYPE -- 指定文件的句柄
)
RETURN BOOLEAN; -- 如果已经打开则返回TRUE,否则返回FALSE
该函数的示例如下:DECLARE
HANDLE UTL_FILE.FILE_TYPE;
BEGIN
IF NOT UTL_FILE.is_open(HANDLE) THEN
HANDLE := UTL_FILE.fopen('CZW','DYWT.TXT','R',1000);
END IF;
DBMS_OUTPUT.PUT_LINE('D:\DYWT.TXT已经被打开');
END;
UTL_FILE.FCLOSE(FILE IN OUT FILE_TYPE);
UTL_FILE.FCLOSE_ALL;
UTL_FILE.GET_LINE(
file IN FILE_TYPE, -- 文件句柄
buffer OUT VARCHAR2, -- 存储读取的Buff
linesize IN NUMBER, -- 读取的最大字节数
len IN PLS_INTEGER DEFAULT NULL -- 实际读取长度
);
使用该过程的示例如下:
DECLARE
HANDLE UTL_FILE.FILE_TYPE;
BUFFER VARCHAR2(100);
BEGIN
IF NOT UTL_FILE.is_open(HANDLE) THEN
HANDLE := UTL_FILE.fopen('CZW','DYWT.TXT','R',1000);
END IF;
UTL_FILE.GET_LINE(HANDLE,BUFFER,100);
DBMS_OUTPUT.PUT_LINE(BUFFER);
UTL_FILE.fclose(HANDLE);
END;
UTL_FILE.GET_RAW(
fid IN UTL_FILE.TYPE, -- 文件句柄
r OUT NOCOPY RAW, -- 读取的缓存Buff
len IN PLS_INTEGER DEFAULT NULL -- 读取长度
);
上面所示:fid用于指定文件的句柄,r用于取得读取信息,示例如下:
DECLARE
HANDLE UTL_FILE.FILE_TYPE;
BUFFER VARCHAR2(2000);
BEGIN
IF NOT UTL_FILE.is_open(HANDLE) THEN
HANDLE := UTL_FILE.fopen('CZW','DYWT.TXT','R',1000);
END IF;
UTL_FILE.GET_RAW(HANDLE,BUFFER,1000);
DBMS_OUTPUT.PUT_LINE(BUFFER);
UTL_FILE.fclose(HANDLE);
END;
该过程用于将缓冲区内容写入到文件中。当使用PUT过程的时候,文件必须以写方式打开,在写入缓冲区之后,如果要结束行,那么可以使用NEW_LINE过程。语法如下:
UTL_FILE.PUT(
file IN FILE_TYPE,
buffer IN VARCHAR2
);
使用该过程的示例如下:
DECLARE
HANDLE UTL_FILE.FILE_TYPE;
BUFFER VARCHAR2(2000);
BEGIN
IF NOT UTL_FILE.IS_OPEN(HANDLE) THEN
HANDLE := UTL_FILE.FOPEN('CZW','NEW.TXT','W',1000);
END IF;
BUFFER:='&CONTENT1';
UTL_FILE.PUT(HANDLE,BUFFER);
UTL_FILE.NEW_LINE(HANDLE);
BUFFER:='&CONTENT2';
UTL_FILE.PUT(HANDLE,BUFFER);
UTL_FILE.NEW_LINE(HANDLE);
UTL_FILE.FCLOSE(HANDLE);
END;
UTL_FILE.PUT_RAW(
fid IN UTL_FILE.FILE_TYPE,
R IN RAW,
autoflush IN BOOLEAN DEFAULT FALSE
);
上述,fid用于指定文件句柄,r用于指定存放RAW数据的缓冲区,autoflush用于指定是否自动刷新缓冲区数据.该过程的示例如下:
DECLARE
HANDLE UTL_FILE.FILE_TYPE;
BUFFER VARCHAR2(2000);
BEGIN
IF NOT UTL_FILE.IS_OPEN(HANDLE) THEN
HANDLE := UTL_FILE.FOPEN('CZW','NEW.TXT','W',1000);
END IF;
BUFFER:='&CONTENT1';
UTL_FILE.PUT_RAW(HANDLE,BUFFER);
UTL_FILE.NEW_LINE(HANDLE);
UTL_FILE.FCLOSE(HANDLE);
END;
UTL_FILE.NEW_LINE(
file IN FILE_TYPE,
lines IN NATURAL :=1 -- 指定在文件中增加的行终止符的个数
);
该过程用于将文本缓冲区内容写入到文件中。当使用该过程为文件追加内容时,会自动在文件的尾部追加行终止符。
UTL_FILE.PUT_LINE (
file IN FILE_TYPE,
buffer IN VARCHAR2,
autoflush IN BOOLEAN DEFAULT FALSE
);
UTL_FILE.FFLUSH(file IN FILE_TYPE):
13、FREMOVE
该过程用于删除磁盘文件。语法如下:UTL_FILE.FREMOVE(
location IN VARCHAR2, -- 指定DIRECTORY,注意,这里也必须要大写
filename IN VARCHAR2 -- 指定要删除的文件名
);
UTL_FILE.FCOPY(
location IN VARCHAR2, -- 指定源DIRECTORY路径对象
filename IN VARCHAR2, -- 指定文件名
dest_dir IN VARCHAR2, -- 希望复制到的Directory路径对象
dest_file IN VARCHAR2, -- 复制后的文件名
start_line IN PLS_INTEGER DEFAULT 1, -- 指定起始行号
end_line IN PLS_INTEGER DEFALUT NULL -- 指定结束行号
);
UTL_FILE.FRENAME(
location IN VARCHAR2,
filename IN VARCHAR2,
dest_dir IN VARCHAR2,
dest_file IN VARCHAR2,
overwrite IN BOOLEAN DEFAULT FALSE -- 是否覆盖已经存在的文件
);
DECLARE
HANDLE UTL_FILE.FILE_TYPE;
BEGIN
HANDLE := UTL_FILE.FOPEN('CZW_DIR','DEPT.TXT','W',1000);
FOR I IN (SELECT T.DEPTNO||','||T.DNAME||','||T.LOC AS MSG FROM SCOTT.DEPT T) LOOP
UTL_FILE.PUT_LINE(HANDLE,I.MSG);
END LOOP;
UTL_FILE.FFLUSH(HANDLE);
UTL_FILE.FCLOSE(HANDLE);
END;
五、参考
http://blog.csdn.net/bisal/article/details/24667609
http://zhangzhongjie.iteye.com/blog/1903024
http://www.2cto.com/database/201301/181232.html
http://blog.csdn.net/john2522/article/details/8124087