• 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
    复制代码

           

           

  • 相关阅读:
    k8s之创建etcd集群
    完美解决微信video视频隐藏控件和内联播放问题
    JS工具库封装:Video转换成Canvas
    H5 video 标签 播放事件
    iSlider 如丝般高性能H5全屏滑动组件
    设计模式之 适配器模式
    c++ STL常用算法使用方法
    快速排序与二分查找
    CLOSE_WAIT TIME_WAIT
    erlang erl文件编译的三种脚本
  • 原文地址:https://www.cnblogs.com/xieweikai/p/6837995.html
一二三 - 开发者的网上家园