UTL_FILE

UTL_FILE,第1张

概述在PL/SQL中,UTL_FILE包提供文本文件输入和输出功能。可以访问的目录通过初始化参数UTL_FILE_DIR设置。注意:UTL_FILE只能读取服务器端文本文件,不能读取二进制文件。这时候,应

在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 )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,1)">ON
'||TO_CHAR(SYSDATE,1)">MM/DD/YY HH24:MI'));
UTL_file.PUT_liNE(v_file_handle,1)">Numbers of users logged on: ||v_user_count); UTL_file.NEW_liNE(v_file_handle); UTL_file.PUT_liNE(v_file_handle,1)">--- 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 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来访问文件

一、 脚本如下

 READ_file   (PI_DIRECTORY    v_file_handle UTL_file.file_TYPE;   v_file_line varchar2(1024BEGIN   v_file_handle :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       UTL_file.FCLOSE(v_file_handle);二、 执行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包将表中数据导出到主机文本文件中

or  outputv_file_handle UTL_file.file_TYPE;  v_file_handle := UTL_file.FOPEN(TMP',1)">output.txt);  UTL_file.PUT_liNE(v_file_handle,1)">EMPNO Ename JOB MGR HIREDATE SAL COMM DEPTNO);
FOR cur_emp IN(SELECT * 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.commcur_emp.deptno); LOOP; UTL_file.FCLOSE(v_file_handle);EXCEPTION WHEN OTHERS DBMS_OUTPUT.PUT_liNE(sqlCODE||chr(10)sqlERRM);END;

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

EMPNO Ename JOB MGR HIREDATE SAL COMM DEPTNO7369 SMITH CLERK 7902 17-DEC-80 800  207499 ALLEN SALESMAN 7698 20-FEB81 1600 300 307521 WARD SALESMAN 221250 500 7566 JOnes MANAGER 7839 02-APR2975  7654 MARTIN SALESMAN 28-SEP1400 7698 BLAKE MANAGER 01-MAY2850  7782 CLARK MANAGER 09-JUN2450  107788 SCott ANALYST 7566 1987 3000  7839 KING PRESIDENT  -NOV5000  7844 TURNER SALESMAN 081500 0 7876 AdamS CLERK 7788 231100  7900 JAMES CLERK 03950  7902 FORD ANALYST 7934 MILLER CLERK 7782 -JAN82 1300  8888 tom SALESMAN 27-AUG14 1000 30

 

 

       

 

       

 

总结

以上是内存溢出为你收集整理的UTL_FILE全部内容,希望文章能够帮你解决UTL_FILE所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1153781.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-01
下一篇 2022-06-01

发表评论

登录后才能评论

评论列表(0条)

保存