UTL
来源:互联网 发布:轮胎动平衡三个数据 编辑:程序博客网 时间:2024/06/08 04:50
在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 outputASv_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 DEPTNO7369 SMITH CLERK 7902 17-DEC-80 800 207499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 307521 WARD SALESMAN 7698 22-FEB-81 1250 500 307566 JONES MANAGER 7839 02-APR-81 2975 207654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 307698 BLAKE MANAGER 7839 01-MAY-81 2850 307782 CLARK MANAGER 7839 09-JUN-81 2450 107788 SCOTT ANALYST 7566 19-APR-87 3000 207839 KING PRESIDENT 17-NOV-81 5000 107844 TURNER SALESMAN 7698 08-SEP-81 1500 0 307876 ADAMS CLERK 7788 23-MAY-87 1100 207900 JAMES CLERK 7698 03-DEC-81 950 307902 FORD ANALYST 7566 03-DEC-81 3000 207934 MILLER CLERK 7782 23-JAN-82 1300 108888 tom SALESMAN 7839 27-AUG-14 1000 0 30
- UTL
- utl解码问题
- AndroidLog日志调试(android.utl.log类)
- Android -- Log日志调试(android.utl.log类)
- //使用js得到utl里边属性的值
- Python练习之scoket库实现批量utl&…
- tomcat设置为UTF-8,解析GBK编码的UTL请求,中文乱码处理
- 关于UTL会自动转码的问题 %自动转换为%25
- SpringMVC怎样获取客户端的ip地址
- Windows常用技巧集锦
- Search in Rotated Sorted Array II
- 51nod1265 四点共面
- 安卓开发:去掉自带的软件名栏
- UTL
- Hrbust 2307 Find your teacher(Floyed算法 | 传递闭包)
- 表达式
- 在eclipse的java EE模式中导入别人的项目出现Multiple annotations found at this line
- 几种实现悬浮下拉菜单的方式
- Java三层架构
- Linux命令(9)——tcpdump命令
- error C2668: “pow”: 对重载函数的调用不明确
- 标准对象