一、说明
    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 directory_namne TO user_name;

--路径授权,添加对路径读、写权限
grant read,write on directory DB_OUT to xilen;--utl_file包授权,添加执行权限
GRANT EXECUTE ON utl_file TO xilen;

查看(具有READ和WRITE权限的目录):

-- 限制单列的显示长度
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;

三、详解
    1、FILE_TYPE
        该类型是UTL_FILE包中定义的记录类型,其成员是私有的,不能够被直接引用。该类型的定义如下:

TYPE file_type IS RECORD(id  BINARY_INTEGER,datatype BINARY_INTEGER
);

2、FOPEN
        该函数用于打开文件。使用这个函数最多可以打开50个文件,语法如下:

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'六种:
        --'r':读文件(文本),一定要保证有该文件,不然会报UTL_FILE.INVALID_PATH异常
        --'w':写文件(文本),没有该文件的话会自动添加;有的话会覆盖
        --'a':追加文件(文本),如果文件不存在,则会以write模式创建此文件
        --带有'b'后缀的为使用byte(字节)模式,BLOB与VARCHAR2不一样,BLOB打开时一定要用带有'b'后缀的模式

3、IS_OPEN
      该函数用于确定文件是否已经被打开,语法如下:

UTL_FILE.IS_OPEN(file IN FILE_TYPE    -- 指定文件的句柄
)RETURN BOOLEAN;    -- 如果已经打开则返回TRUE,否则返回FALSE

该函数的示例如下:

DECLAREHANDLE UTL_FILE.FILE_TYPE;
BEGINIF NOT UTL_FILE.is_open(HANDLE) THENHANDLE := UTL_FILE.fopen('CZW','DYWT.TXT','R',1000);END IF;DBMS_OUTPUT.PUT_LINE('D:\DYWT.TXT已经被打开');
END;

4、FCLOSE
        该过程用于关闭已经打开的文件,语法如下:

UTL_FILE.FCLOSE(FILE IN OUT FILE_TYPE);

5、FCLOSE_ALL
        该过程用于关闭当前打开的所有文件。语法如下:

UTL_FILE.FCLOSE_ALL;

6、GET_LINE
        该过程用于从已经打开的文件中读取行内容,行内容会被读取到输出缓冲区。语法如下:

UTL_FILE.GET_LINE(file IN FILE_TYPE,    -- 文件句柄buffer OUT VARCHAR2,    -- 存储读取的Bufflinesize IN NUMBER,    -- 读取的最大字节数len IN PLS_INTEGER DEFAULT NULL    -- 实际读取长度
);

使用该过程的示例如下:

DECLAREHANDLE UTL_FILE.FILE_TYPE;BUFFER VARCHAR2(100);
BEGINIF NOT UTL_FILE.is_open(HANDLE) THENHANDLE := 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;

7、GET_RAW
        该过程用于从文件中读取RAW字符串,并调节文件指针到读取位置。语法如下:

UTL_FILE.GET_RAW(fid IN UTL_FILE.TYPE,    -- 文件句柄r  OUT NOCOPY RAW,    -- 读取的缓存Bufflen IN PLS_INTEGER DEFAULT NULL    -- 读取长度
);

上面所示:fid用于指定文件的句柄,r用于取得读取信息,示例如下:

DECLAREHANDLE UTL_FILE.FILE_TYPE;BUFFER VARCHAR2(2000);
BEGINIF NOT UTL_FILE.is_open(HANDLE) THENHANDLE := 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;

8、PUT

该过程用于将缓冲区内容写入到文件中。当使用PUT过程的时候,文件必须以写方式打开,在写入缓冲区之后,如果要结束行,那么可以使用NEW_LINE过程。语法如下:

UTL_FILE.PUT(file IN FILE_TYPE,buffer IN VARCHAR2
);

使用该过程的示例如下:

DECLAREHANDLE UTL_FILE.FILE_TYPE;BUFFER VARCHAR2(2000);
BEGINIF NOT UTL_FILE.IS_OPEN(HANDLE) THENHANDLE := 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;

9、PUT_RAW
        该过程用于将RAW缓冲区中的数据写入文件中。语法如下:

UTL_FILE.PUT_RAW(fid IN UTL_FILE.FILE_TYPE,R IN RAW,autoflush IN BOOLEAN DEFAULT FALSE
);

上述,fid用于指定文件句柄,r用于指定存放RAW数据的缓冲区,autoflush用于指定是否自动刷新缓冲区数据.该过程的示例如下:

DECLAREHANDLE UTL_FILE.FILE_TYPE;BUFFER VARCHAR2(2000);
BEGINIF NOT UTL_FILE.IS_OPEN(HANDLE) THENHANDLE := 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;

10、NEW_LINE
        该过程用于为文件增加行终止符,语法如下:

UTL_FILE.NEW_LINE(file IN FILE_TYPE,lines IN NATURAL :=1    -- 指定在文件中增加的行终止符的个数
);

11、PUT_LINE

该过程用于将文本缓冲区内容写入到文件中。当使用该过程为文件追加内容时,会自动在文件的尾部追加行终止符。

UTL_FILE.PUT_LINE ( file IN FILE_TYPE,buffer IN VARCHAR2,autoflush IN BOOLEAN DEFAULT FALSE
);

12、FFLUSH         该过程用于将数据强制性写入到文件中,正常情况下,当给文件写入数据的时候,数据会被暂时的放到缓存中。过程FFLUSH用于强制将数据写入到文件中。语法如下:

UTL_FILE.FFLUSH(file IN FILE_TYPE):

13、FREMOVE

该过程用于删除磁盘文件。语法如下:

UTL_FILE.FREMOVE(location IN VARCHAR2,    -- 指定DIRECTORY,注意,这里也必须要大写filename IN VARCHAR2    -- 指定要删除的文件名
);

14、FCOPY
        该过程用于将源文件的全部或者部分内容复制到目标文件中。当使用该过程的时候,如果不设起始行和结束行,则将复制文件所有的内容。语法如下:

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    -- 指定结束行号
);

15、FRENAME
        该过程用于修改已经存在的文件名字,其作用于UNIX的MV命令完全相同,在修改文件名字的时候,通过指定overwrite参数可以覆盖已经存在的文件。语法如下:

UTL_FILE.FRENAME(location IN VARCHAR2,filename IN VARCHAR2,dest_dir IN VARCHAR2,dest_file IN VARCHAR2,overwrite IN BOOLEAN DEFAULT FALSE    -- 是否覆盖已经存在的文件
);


四、示例

    导出表数据示例:

DECLAREHANDLE UTL_FILE.FILE_TYPE;
BEGINHANDLE := 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) LOOPUTL_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

Oracle - UTL_FILE包之详解相关推荐

  1. mysql utl_file_Oracle之UTL_FILE 包用法详解

    UTL_FILE包可以用来读写操作系统上的文本文件,UTL_FILE提供了在客户端(FORM等等)和服务器端的文件访问功能. UTL_FILE包可以用来读写操作系统上的文本文件,UTL_FILE提供了 ...

  2. [强烈推荐]ORACLE PL/SQL编程详解之七:程序包的创建与应用(聪明在于学习,天才在于积累!)...

    [强烈推荐]ORACLE PL/SQL编程详解之七: 程序包的创建与应用(聪明在于学习,天才在于积累!) --通过知识共享树立个人品牌.   继上七篇:            [推荐]ORACLE P ...

  3. Oracle之DBMS_SQL包用法详解

    Oracle之DBMS_SQL包用法详解 原文  http://zhangzhongjie.iteye.com/blog/1948093 通常运用 DBMS_SQL 包一般分为 如下 几步: 1. o ...

  4. python哪里下载import包-【Python实战】模块和包导入详解(import)

    1.模块(module) 1.1 模块定义 通常模块为一个.py文件,其他可作为module的文件类型还有".pyo".".pyc".".pyd&qu ...

  5. [顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功)...

    [顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功) 原文:[顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之 ...

  6. oracle 11g目录结构详解

    oracle 11g目录结构详解-pf文件 概述 前段时间有朋友留言需要oracle目录结构的介绍,所以整理了下这方面内容,这里简单分享下,下面以oracle 11g目录结构做说明. 11g目录结构 ...

  7. Oracle PL/SQL编程详解

    Oracle PL/SQL编程详解 - 古立 - 博客园 <我的网络摘抄本> 网摘/转载/备忘/随记 博客园 首页 新随笔 联系 管理 订阅 随笔- 84  文章- 0  评论- 0  & ...

  8. zabbix如何监控oracle,使用zabbix监控oracle数据库的方法详解

    一.概述 zabbix是一款非常强大,同时也是应用最为广泛的开源监控软件,本文将给大家介绍如何利用zabbix+python监控oracle数据库. 二.环境介绍 以下是我安装的环境,实际部署时并不需 ...

  9. ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功)

    [顶]ORACLE PL/SQL编程详解之二: PL/SQL块结构和组成元素(为山九仞,岂一日之功) 继上四篇:ORACLE PL/SQL编程之八:把触发器说透                ORAC ...

最新文章

  1. StringBuffer的delete方法与deleteCharAt方法的区别。
  2. 【递归】【线段树】【堆】AtCoder Regular Contest 080 E - Young Maids
  3. 已知数据信息为 16位,最少应附加( )位校验位,以实现海明码纠错。
  4. 常见的算法面试问题以及代码实现
  5. 获取和设置消息队列的属性msgctl,删除消息队列
  6. Golang gRPC实践 连载七 HTTP协议转换
  7. Windows 查看端口使用情况
  8. 如何在Java项目中查找未使用/无效的代码
  9. 数据库 -- MySQL使用
  10. c++ 一个函数包括多个返回值判断_整活函数式编程
  11. Real Time Rendering 第一章 简介
  12. Samsung 6818平台首次编译遇到的问题
  13. 豆瓣读书TOP250书籍信息爬虫脚本
  14. Win10任务栏假死问题解决方案
  15.  定义一个变量,是一个三位数,求各个位数的和
  16. 使用IR2101半桥驱动电机的案例
  17. unity 制作插件
  18. ajax上传 java,javaWeb中使用ajax上传文件
  19. 实现 组件-实体-系统
  20. 人工智能发展简史——未来是属于AI人工智能的。

热门文章

  1. 什么网站适合高防服务器,什么叫高防服务器
  2. 过来人对研究生阶段的学习建议
  3. 浅析CV下的无人驾驶技术
  4. Java丨即时聊天程序的实现
  5. 【MyBatis】基础全网最全,看这篇就够了
  6. 电脑开机密码忘记了怎么办
  7. 关于wap上网及彩信的一点想法
  8. 伤寒杂病论.辨阳明病脉证并治
  9. Red Hat 镜像下载
  10. 什么是大数据,大数据的处理流程介绍