在PL/SQL中,UTL_FILE包提供文本文件输入和输出功能。

可以访问的目录通过初始化参数UTL_FILE_DIR设置。

注意:UTL_FILE只能读取服务器端文本文件,不能读取二进制文件。这时候,应该使用DBMS_LOB包。

使用UTL_FILE包的方法是打开文件文件,执行文件内容写入和读取等操作,然后关闭这个文件。如果不关闭这个文件,操作系统会认为这个文件当前正在使用中,不允许在关闭之前再次写入这个文件。

下表列出了UTL_FILE包的主要函数、过程及描述。

下表列出了该报的异常情况及描述。

下面的范例会演示将日期、时间和当前所登陆用户数写入日志文件。

如何利用UTL_FILE来写文件

一、 设置UTL_FILE_DIR初始化参数

SQL> alter system set utl_file_dir='/home/oracle' scope=spfile;

重启数据库

二、赋予test用户访问v$session表的权限

SQL> grant select on v_$session to test;

三、脚本如下

CREATE OR REPLACE PROCEDURE LOG_USER_COUNT
(PI_DIRECTORY IN VARCHAR2,
PI_FILE_NAME IN VARCHAR2)
AS
v_file_handle UTL_FILE.FILE_TYPE;
v_user_count number;
BEGIN
SELECT count(*)
INTO v_user_count
FROM v$session
WHERE username is not null;
v_file_handle := UTL_FILE.FOPEN(PI_DIRECTORY,PI_FILE_NAME,'W');
UTL_FILE.PUT_LINE(v_file_handle,'--- User log ---');
UTL_FILE.NEW_LINE(v_file_handle);
UTL_FILE.PUT_LINE(v_file_handle,'ON '||TO_CHAR(SYSDATE,'MM/DD/YY HH24:MI'));
UTL_FILE.PUT_LINE(v_file_handle,'Numbers of users logged on: '||v_user_count);
UTL_FILE.NEW_LINE(v_file_handle);
UTL_FILE.PUT_LINE(v_file_handle,'--- End log ---');
UTL_FILE.NEW_LINE(v_file_handle);
UTL_FILE.FCLOSE(v_file_handle);
EXCEPTION
WHEN UTL_FILE.INVALID_FILENAME THEN
DBMS_OUTPUT.PUT_LINE('File is invalid');
WHEN UTL_FILE.WRITE_ERROR THEN
DBMS_OUTPUT.PUT_LINE('Oracle is not able to write to file');
END;

四、 执行log_user_count过程

SQL> exec log_user_count('/home/oracle','user.log');

五、查看结果

[oracle@node2 ~]$ cat user.log
       --- User log ---

ON 06/25/14 03:02
       Numbers of users logged on: 1

--- End log ---

上述范例演示的是如何利用UTL_FILE来写文件,下面我们来看看如何利用UTL_FILE来访问文件,结果基于上例

如何利用UTL_FILE来访问文件

一、 脚本如下

CREATE OR REPLACE PROCEDURE READ_FILE
(PI_DIRECTORY IN VARCHAR2,
PI_FILE_NAME IN VARCHAR2)
AS
v_file_handle UTL_FILE.FILE_TYPE;
v_file_line varchar2(1024);
BEGIN
v_file_handle := UTL_FILE.FOPEN(PI_DIRECTORY,PI_FILE_NAME,'R');
LOOP
UTL_FILE.GET_LINE(v_file_handle,v_file_line);
DBMS_OUTPUT.PUT_LINE(v_file_line);
END LOOP;
EXCEPTION
WHEN NO_DATA_FOUND THEN
UTL_FILE.FCLOSE(v_file_handle);
END;

二、 执行read_file过程

SQL> exec read_file('/home/oracle','user.log');

--- User log ---
      ON 06/25/14 03:02
      Numbers of users logged on: 1
      --- End log ---

PL/SQL procedure successfully completed.

附:如何利用UTL_FILE包将表中数据导出到主机文本文件中

CREATE or REPLACE PROCEDURE output
AS
v_file_handle UTL_FILE.FILE_TYPE;
BEGIN
v_file_handle := UTL_FILE.FOPEN('TMP','output.txt','W');
UTL_FILE.PUT_LINE(v_file_handle,'EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO');
FOR cur_emp IN(SELECT * FROM emp)
LOOP
UTL_FILE.PUT_LINE(v_file_handle,cur_emp.empno||' '||cur_emp.ename||' '||cur_emp.job||' '||cur_emp.mgr||' '||cur_emp.hiredate||' '||cur_emp.sal||' '||cur_emp.comm||' '||cur_emp.deptno);
END LOOP;
UTL_FILE.FCLOSE(v_file_handle);
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLCODE||chr(10)||SQLERRM);
END;

生成的output.txt内容如下所示:

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
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
8888 tom SALESMAN 7839 27-AUG-14 1000 0 30

UTL_FILE的更多相关文章

  1. ORACLE之UTL_FILE包详解

    1 Utl_File包简介Oracle的UTL_FILE包用来实现对磁盘文件的I/O操作.(1)Oracle10g之前的版本需要指定utl_file包可以操作的目录.      方法:        ...

  2. UTL_FILE建文件失败“ORA-29280: 目录路径无效”错误

    存储过程写文件需要配置可写的目录,具体是utl_file_dir这个参数,把UTL_FILE输出的目录写到这个参数,如果不限制,可以令utl_file_dir=*   查看:   SQL> sh ...

  3. UTL_FILE详解

    包UTL_FILE 提供了在操作系统层面上对文件系统中文件的读写功能.非超级用户在使用包UTL_FILE中任何函数或存储过程前必须由超级用户授予在这个包上的EXECUTE权限.例如:我们使用下列命令对 ...

  4. 利用utl_file来读取文件.

    以前写过用external table来加载trace文件,详情参考下面链接. http://www.cnblogs.com/princessd8251/p/3779145.html 今天要做到是用U ...

  5. PLS-00201: 必须声明标识符 'UTL_FILE'

    解决办法: 用sysdba身份 把UTL_FILE包的执行权限给这个用户. 举例: 1.C:\Users\Anakin>sqlplus /nolog2.SQL> connect /as s ...

  6. UTL_FILE 的用法

    UTL_FILE 的用法   UTL_FILE 是用来进行文件IO处理的专用包,使用这外包的注意事项如下: 1. 生成的文件好象只能放置在DATABASE所在的服务器路径中. 2. 生成的文件如何DO ...

  7. oracle读写文件--利用utl_file包对磁盘文件的读写操作

    oracle读写文件--利用utl_file包对磁盘文件的读写操作 摘要: 用户提出一个需求,即ORACLE中的一个表存储了照片信息,字段类型为BLOB,要求能导出成文件形式. 本想写个C#程序来做, ...

  8. utl_file包的使用

    首先看一下oracle 脚本 /* # $Header: HTMomse12.sql 12.0.4 20121015 Support $ #+============================= ...

  9. 快速导入导出Oracle数据demo(sqlldr、UTL_FILE)

    本文演示快速sqlldr导入.UTL_FILE导出Oracle表数据实例 表结构如下,演示数据约112万,可自行准备. create table MemberPointDemo ( MEMBERID ...

随机推荐

  1. caffe在windows 下的配置及matlab接口编译(无GPU)

    本人机子windows 10,matlab2015a,vs2013(官网使用的是vs2013) 1.首先去github上下载caffe的windows包,地址:https://github.com/B ...

  2. 使用的组件:JQuery UI

    jQuery UI包含了许多维持状态的小部件(Widget),因此,它与典型的 jQuery 插件使用模式略有不同.所有的 jQuery UI 小部件(Widget)使用相同的模式,所以,只要您学会使 ...

  3. Linux CentOS下如何确认MySQL服务已经启动

    Linux CentOS一般做为服务器使用,因此,MySQL服务应该随开机自动启动的.正常情况下,查看开机自动启动的服务使用chkconfig命令,如下: #chkconfig --list 实际使用 ...

  4. ASP.NET 5 入门(1) - 建立和开发ASP.NET 5 项目

    ASP.NET入门(1) - 建立和开发ASP.NET 5 项目 ASP.NET 5 理解和入门 使用自定义配置文件 建立项目 首先,目前只有VS 2015支持开发最新的ASP.NET 5 程序,所以 ...

  5. (转)对SQLSERVER数据库事务日志的疑问

    本文转载自桦仔的博客http://www.cnblogs.com/lyhabc/archive/2013/06/10/3130856.html 对SQLSERVER数据库事务日志的疑问 摸不透SQLS ...

  6. 译文---C#堆VS栈(Part Three)

    前言 在本系列的第一篇文章<C#堆栈对比(Part Two)>中,介绍了值类型和引用类型在参数传递时的不同,本文将讨论如何应用ICloneable接口实现去修复引在堆上的用变量所带来的问题 ...

  7. 译文---C#堆VS栈(Part Four)

    前言 在本系列的第一篇文章<C#堆栈对比(Part Three)>中,介绍了值类型和引用类型在Copy上的区别以及如何实现引用类型的克隆以及使用ICloneable接口等内容. 本文为文章 ...

  8. 基础调试命令 - .dump/.dumpcap/.writemem/!runaway

    Windbg是windows平台上强大的调试器,它相对于其他常见的IDE集成的调试器有几个重要的优势, Windbg可以做内核态调试 Windbg可以脱离源代码进行调试 Windbg可以用来分析dum ...

  9. [stm32] 一个简单的stm32vet6驱动2.4寸240X320的8位并口tft屏DEMO

    书接上文: 最近在研究用低速.低RAM的单片机来驱动小LCD或TFT彩屏实现动画效果 首先我用一个16MHz晶振的m0内核的8位单片机nRF51822尝试驱动一个1.77寸的4线SPI屏(128X16 ...

  10. 自制Unity小游戏TankHero-2D(2)制作敌方坦克

    自制Unity小游戏TankHero-2D(2)制作敌方坦克 我在做这样一个坦克游戏,是仿照(http://game.kid.qq.com/a/20140221/028931.htm)这个游戏制作的. ...