UTL

Posted 谢维开

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UTL相关的知识,希望对你有一定的参考价值。

在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的主要内容,如果未能解决你的问题,请参考以下文章

UTL_FILE:无法创建新文件

为啥 HTTP 请求在 UTL_hhtp oracle 包上反复失败?

如何在 oracle 中使用 utl_file 写入文件

仅在第二个代码块中遇到“ORA-29283:无效文件操作”(第一个块也成功执行,它也使用 UTL_FILE)

PL/SQL UTL_FILE:循环如何自动返回下一行?

Oracle PL/SQL 实现发送电子邮件功能(UTL_MAIL)