在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;

三、脚本如下

  1. CREATE OR REPLACE PROCEDURE LOG_USER_COUNT
  2. (PI_DIRECTORY IN VARCHAR2,
  3. PI_FILE_NAME IN VARCHAR2)
  4. AS
  5. v_file_handle UTL_FILE.FILE_TYPE;
  6. v_user_count number;
  7. BEGIN
  8. SELECT count(*)
  9. INTO v_user_count
  10. FROM v$session
  11. WHERE username is not null;
  12. v_file_handle := UTL_FILE.FOPEN(PI_DIRECTORY,PI_FILE_NAME,'W');
  13. UTL_FILE.PUT_LINE(v_file_handle,'--- User log ---');
  14. 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);
  15. UTL_FILE.NEW_LINE(v_file_handle);
  16. UTL_FILE.PUT_LINE(v_file_handle,'--- End log ---');
  17. UTL_FILE.NEW_LINE(v_file_handle);
  18. UTL_FILE.FCLOSE(v_file_handle);
  19. EXCEPTION
  20. WHEN UTL_FILE.INVALID_FILENAME THEN
  21. DBMS_OUTPUT.PUT_LINE('File is invalid');
  22. WHEN UTL_FILE.WRITE_ERROR THEN
  23. DBMS_OUTPUT.PUT_LINE('Oracle is not able to write to file');
  24. 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来访问文件

一、 脚本如下

  1. CREATE OR REPLACE PROCEDURE READ_FILE
  2. (PI_DIRECTORY IN VARCHAR2,
  3. PI_FILE_NAME IN VARCHAR2)
  4. AS
  5. v_file_handle UTL_FILE.FILE_TYPE;
  6. v_file_line varchar2(1024);
  7. BEGIN
  8. v_file_handle := UTL_FILE.FOPEN(PI_DIRECTORY,PI_FILE_NAME,'R');
  9. LOOP
  10. UTL_FILE.GET_LINE(v_file_handle,v_file_line);
  11. DBMS_OUTPUT.PUT_LINE(v_file_line);
  12. END LOOP;
  13. EXCEPTION
  14. WHEN NO_DATA_FOUND THEN
  15. UTL_FILE.FCLOSE(v_file_handle);
  16. 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包将表中数据导出到主机文本文件中

  1. CREATE or REPLACE PROCEDURE output
  2. AS
  3. v_file_handle UTL_FILE.FILE_TYPE;
  4. BEGIN
  5. v_file_handle := UTL_FILE.FOPEN('TMP','output.txt','W');
  6. UTL_FILE.PUT_LINE(v_file_handle,'EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO');
    FOR cur_emp IN(SELECT * FROM emp)
  7. LOOP
  8. 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);
  9. END LOOP;
  10. UTL_FILE.FCLOSE(v_file_handle);
  11. EXCEPTION
  12. WHEN OTHERS THEN
  13. DBMS_OUTPUT.PUT_LINE(SQLCODE||chr(10)||SQLERRM);
  14. END;

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

  1. EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
  2. 7369 SMITH CLERK 7902 17-DEC-80 800 20
  3. 7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
  4. 7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
  5. 7566 JONES MANAGER 7839 02-APR-81 2975 20
  6. 7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30
  7. 7698 BLAKE MANAGER 7839 01-MAY-81 2850 30
  8. 7782 CLARK MANAGER 7839 09-JUN-81 2450 10
  9. 7788 SCOTT ANALYST 7566 19-APR-87 3000 20
  10. 7839 KING PRESIDENT 17-NOV-81 5000 10
  11. 7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30
  12. 7876 ADAMS CLERK 7788 23-MAY-87 1100 20
  13. 7900 JAMES CLERK 7698 03-DEC-81 950 30
  14. 7902 FORD ANALYST 7566 03-DEC-81 3000 20
  15. 7934 MILLER CLERK 7782 23-JAN-82 1300 10
  16. 8888 tom SALESMAN 7839 27-AUG-14 1000 0 30

UTL的更多相关文章

  1. 如何在ASP.Net创建各种3D图表

    我们都知道,图表在ASP.NET技术中是一种特别受欢迎而又很重要的工具.图表是表示数据的图形,一般含有X和Y两个坐标轴.我们可以用折线,柱状,块状来表示数据.通过图表控件,我们即能表示数据又能比较各种 ...

  2. C#跨平台手机应用开发工具Xamarin尝试 与Eclipse简单对比

    Xamarin 支持使用C#开发基于Android.IOS.WindowsPhone应用开发,最大特点C#+跨平台,详细说明问度娘. 安装 研究 想体验研究的点击查看页面 Xamarin For Vi ...

  3. 完整记录一则Oracle 11.2.0.4单实例打PSU补丁的过程

    本文记录了打PSU的全过程,意在体会数据库打PSU补丁的整个过程. 1.OPatch替换为最新版本2.数据库软件应用19121551补丁程序3.数据库应用补丁4.验证PSU补丁是否应用成功 1.OPa ...

  4. java web学习总结(三十一) -------------------EL表达式

    一.EL表达式简介 EL 全名为Expression Language.EL主要作用: 1.获取数据 EL表达式主要用于替换JSP页面中的脚本表达式,以从各种类型的web域 中检索java对象.获取数 ...

  5. jQuery中的Sizzle引擎分析

    我分析的jQuery版本是1.8.3.Sizzle代码从3669行开始到5358行,将近2000行的代码,这个引擎的版本还是比较旧,最新的版本已经到v2.2.2了,代码已经超过2000行了.并且还有个 ...

  6. AngularJS----服务,表单,模块

    AngularJS中的服务 服务是一个函数或对象,AngularJS中可以创建自己的服务或使用内建服务.$http是AngularJS中最常见的服务,服务向服务器发送请求,应用响应服务器传送过来的数据 ...

  7. SQL Server 2008 R2——使用计算列为表创建自定义的自增列

    =================================版权声明================================= 版权声明:原创文章 谢绝转载  请通过右侧公告中的“联系邮 ...

  8. [Java入门笔记] 面向对象编程基础(二):方法详解

    什么是方法? 简介 在上一篇的blog中,我们知道了方法是类中的一个组成部分,是类或对象的行为特征的抽象. 无论是从语法和功能上来看,方法都有点类似与函数.但是,方法与传统的函数还是有着不同之处: 在 ...

  9. sql server 存储过程 以及java如何使用存储过程

    Sql 语句 有一个test_table1表  他有两个字段  ID 和name proc是procedure的缩写 也就是存储过程,StuProc2为创建的存储过程名称 执行以下创建存储后会在Sql ...

随机推荐

  1. Cocos2d-x v3.0正式版尝鲜体验【2】 Android平台移植

    今天没事又尝试了下3.0正式版关于Android平台的移植,把新建的项目移植了下.过程仅用了十分钟左右,什么概念?! 好吧,事实上我想说,这个版本号真的移植非常轻松啊,只是还没加上其它东西,只是就眼下 ...

  2. Linux下的ssh实验环境搭建与管理

    实验环境[size=10.5000pt]1:网桥模式[size=10.5000pt]2:安装好vmtoos[size=10.5000pt]3:安装好yum[size=10.5000pt]4:安装好ss ...

  3. 【转】android-修改TextView中部分文字的颜色

    textView = (TextView) findViewById(R.id.textview); SpannableStringBuilder builder = new SpannableStr ...

  4. JavaScript Patterns 2.6 switch Pattern

    Principle • Aligning each case with switch(an exception to the curly braces indentation rule). • Ind ...

  5. Spark 机器学习------逻辑回归

    package Spark_MLlib import javassist.bytecode.SignatureAttribute.ArrayType import org.apache.spark.s ...

  6. Linux命令补充及基础优化。

    1.用户部分 1.1 创建新用户 涉及命令 useradd [root@oldboyedu-50 ~]# useradd oldboy #添加用户 oldboy 1.2 设置密码 [root@oldb ...

  7. E20170617-hm

    notation   n. 记号,标记法; implicit   adj. 不言明[含蓄]的; 无疑问的,绝对的; 成为一部份的; 内含的; selector   n. 选择者,选择器; promot ...

  8. Rails 服务器架设失败问题

    更新: 2017/09/14 补充了简单的确认号码的方法 A server is already running. Check /Users/...../pids/server.pid. Exitin ...

  9. androd基础入门---1环境

    1.项目结构特性 2.模拟器设置 3.编译器的下载 直接点击运行即可

  10. poj1200Crazy Search(hash)

    题目大意   将一个字符串分成长度为N的字串.且不同的字符不会超过NC个.问总共有多少个不同的子串. /* 字符串hash O(n)枚举起点 然后O(1)查询子串hash值 然后O(n)找不一样的个数 ...