zoukankan      html  css  js  c++  java
  • 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 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

           

           

  • 相关阅读:
    格式化数字,将字符串格式的数字,如:1000000 改为 1 000 000 这种展示方式
    jquery图片裁剪插件
    前端开发采坑之安卓和ios的兼容问题
    页面消息提示,上下滚动
    可以使用css的方式让input不能输入文字吗?
    智慧农村“三网合一”云平台测绘 大数据 农业 信息平台 应急
    三维虚拟城市平台测绘 大数据 规划 三维 信息平台 智慧城市
    农业大数据“一张图”平台测绘 大数据 房产 国土 农业 信息平台
    应急管理管理局安全生产预警平台应急管理系统不动产登记 测绘 大数据 规划 科教 三维 信息平台
    地下综合管廊管理平台测绘 大数据 地下管线 三维 信息平台
  • 原文地址:https://www.cnblogs.com/ivictor/p/3913020.html
Copyright © 2011-2022 走看看