开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 1455|回复: 1
收起左侧

[其它数据库例题] ORACLE的UTL_FILE包

[复制链接]

结帖率:61% (35/57)
发表于 2013-1-14 14:34:27 | 显示全部楼层 |阅读模式   海南省海口市
UTL_FIle用于读写操作系统的文件,前提是首先创建Directory对象、授权。然后就可以使用UTL_FILE包中提供的类型、过程、函数来读取,写入,操作目录中的文件了。  创建Directory的示例如下:
  SQL> CREATE DIRECTORY CZW AS 'D:\';
  Directory created
  SQL> GRANT READ,WRITE ON DIRECTORY CZW TO SCOTT;
  Grant succeeded
  1、FILE_TYPE
  该类型是UTL_FILE包中定义的记录类型,其成员是私有的,不能够被直接引用。该类型的定义如下:
  TYPE file_type IS RECORD(
  id  BINARY_INTEGER,datatype BINARY_INTEGER
  );
  2、FOPEN
  该函数用于打开文件。使用这个函数最多可以打开50个文件,语法如下:
  UTL_FILE.FOPEN(
  location IN VARCHAR2,
  filename IN VARCHAR2,
  open_mode IN VARCHAR2,
  max_linesize IN BINARY_INTEGER
  )
  RETURN file_type;
  当成功的执行了该函数之后,就会返回文件句柄,访问该文件可以使用该文件句柄。如果执行失败的话,则会触发例外或者显示错误。注意,当指定文件位置的时候,必须要使用DIRECTORY对象,并且其名称必须为大写。示例如下:
  DECLARE
  HANDLE UTL_FILE.FILE_TYPE;
  BEGIN
  HANDLE := UTL_FILE.fopen('CZW','DYWT.TXT','R',1000);
  DBMS_OUTPUT.PUT_LINE('D:\DYWT.TXT已经被打开');
  END;
3、FOPEN_NCHAR  该函数用于以UNICODE方式打开文件。当使用该函数打开文件之后,读写文件会使用UNICODE取代数据库字符集。语法如下:
  UTL_FILE.FOPEN_NCHAR(
  location IN VARCHAR2,
  filename IN VARCHAR2,
  open_mode IN VARCHAR2,
  max_linesize IN BINARY_INTEGER)
  RETURN file_type;
  4、IS_OPEN
  该函数用于确定文件是否已经被打开,语法如下:
  UTL_FILE.IS_OPEN(file IN FILE_TYPE) RETURN BOOLEAN;
  如上所示,file用于指定文件句柄。如果文件已经被打开,则返回TRUE,否则则返回FALSE,该函数的示例如下:
  DECLARE
  HANDLE UTL_FILE.FILE_TYPE;
  BEGIN
  IF NOT UTL_FILE.is_open(HANDLE) THEN
  HANDLE := UTL_FILE.fopen('CZW','DYWT.TXT','R',1000);
  END IF;
  DBMS_OUTPUT.PUT_LINE('D:\DYWT.TXT已经被打开');
  END;
  5、FCLOSE
  该过程用于关闭已经打开的文件,语法如下:
  UTL_FILE.FCLOSE(FILE IN OUT FILE_TYPE);
  6、FCLOSE_ALL
  该过程用于关闭当前打开的所有文件。语法如下:
  UTL_FILE.FCLOSE_ALL;
  7、GET_LINE
  该过程用于从已经打开的文件中读取行内容,行内容会被读取到输出缓冲区。语法如下:
  UTL_FILE.GET_LINE(
  file IN FILE_TYPE,
  buffer OUT VARCHAR2,
  linesize IN NUMBER,
  len IN PLS_INTEGER DEFAULT NULL
  );
  如上所示,buffer用于存储读取信息;linesize用于要指定读取的最大字节数;len用于指定实际读取的长度。使用该过程的示例如下:
  DECLARE
  HANDLE UTL_FILE.FILE_TYPE;
  BUFFER VARCHAR2(100);
  BEGIN
  IF NOT UTL_FILE.is_open(HANDLE) THEN
  HANDLE := UTL_FILE.fopen('CZW','DYWT.TXT','R',1000);
  END IF;
  UTL_FILE.GET_LINE(HANDLE,BUFFER,100);
  DBMS_OUTPUT.PUT_LINE(BUFFER);
  UTL_FILE.fclose(HANDLE);
  END;
  8、GET_LINE_NCHAR
  该过程的用法同上面的是一样的,只不过是用UNICODE方式读取已经打开的文件的行内容,并且将行内容读取到输出缓冲区中。
9、GET_RAW  该过程用于从文件中读取RAW字符串,并调节文件指针到读取位置。语法如下:
  UTL_FILE.GET_RAW(
  fid IN UTL_FILE.TYPE,
  r  OUT NOCOPY RAW,
  len IN PLS_INTEGER DEFAULT NULL
  );
  上面所示:fid用于指定文件的句柄,r用于取得读取信息,示例如下:
  DECLARE
  HANDLE UTL_FILE.FILE_TYPE;
  BUFFER VARCHAR2(2000);
  BEGIN
  IF NOT UTL_FILE.is_open(HANDLE) THEN
  HANDLE := UTL_FILE.fopen('CZW','DYWT.TXT','R',1000);
  END IF;
  UTL_FILE.GET_RAW(HANDLE,BUFFER,1000);
  DBMS_OUTPUT.PUT_LINE(BUFFER);
  UTL_FILE.fclose(HANDLE);
  END;
  10、PUT
  该过程用于将缓冲区内容写入到文件中。当使用PUT过程的时候,文件必须以写方式打开,在写入缓冲区之后,如果要结束行,那么可以使用NEW_LINE过程。语法如下:
  UTL_FILE.PUT(file IN FILE_TYPE,buffer IN VARCHAR2);
  使用该过程的示例如下:
  DECLARE
  HANDLE UTL_FILE.FILE_TYPE;
  BUFFER VARCHAR2(2000);
  BEGIN
  IF NOT UTL_FILE.IS_OPEN(HANDLE) THEN
  HANDLE := UTL_FILE.FOPEN('CZW','NEW.TXT','W',1000);
  END IF;
  BUFFER:='&CONTENT1';
  UTL_FILE.PUT(HANDLE,BUFFER);
  UTL_FILE.NEW_LINE(HANDLE);
  BUFFER:='&CONTENT2';
  UTL_FILE.PUT(HANDLE,BUFFER);
  UTL_FILE.NEW_LINE(HANDLE);
  UTL_FILE.FCLOSE(HANDLE);
  END;
  11、PUT_NCHAR
  作用同上,该过程用于将缓冲区的内容以UNICODE方式写入到文件。
  12、PUT_RAW
  该过程用于将RAW缓冲区中的数据写入文件中。语法如下:
  UTL_FILE.PUT_RAW(
  fid IN UTL_FILE.FILE_TYPE,
  R   IN RAW,
  autoflush IN BOOLEAN DEFAULT FALSE
  )
  上述,fid用于指定文件句柄,r用于指定存放RAW数据的缓冲区,autoflush用于指定是否自动刷新缓冲区数据。该过程的示例如下:
  DECLARE
  HANDLE UTL_FILE.FILE_TYPE;
  BUFFER VARCHAR2(2000);
  BEGIN
  IF NOT UTL_FILE.IS_OPEN(HANDLE) THEN
  HANDLE := UTL_FILE.FOPEN('CZW','NEW.TXT','W',1000);
  END IF;
  BUFFER:='&CONTENT1';
  UTL_FILE.PUT_RAW(HANDLE,BUFFER);
  UTL_FILE.NEW_LINE(HANDLE);
  UTL_FILE.FCLOSE(HANDLE);
  END;
  13、NEW_LINE
  该过程用于为文件增加行终止符,语法如下:
  UTL_FILE.NEW_LINE(file IN FILE_TYPE,lines IN NATURAL :=1);
  后面的lines用于指定在文件中增加的行终止符的个数。
  14、PUT_LINE
  该过程用于将文本缓冲区内容写入到文件中。当使用该过程为文件追加内容时,会自动在文件的尾部追加行终止符。
  DECLARE
  HANDLE UTL_FILE.FILE_TYPE;
  BUFFER VARCHAR2(2000);
  BEGIN
  IF NOT UTL_FILE.is_open(HANDLE) THEN
  HANDLE := UTL_FILE.fopen('CZW','DYWT.TXT','W',1000);
  END IF;
  BUFFER := '&CONTENT';
  UTL_FILE.put_line(HANDLE,BUFFER);
  UTL_FILE.fclose(HANDLE);
  END;
  注意:会删掉之前的数据,是在新写入的行后面增加一个行结束符。
15、PUT_LINE_NCHAR  同上,该过程用于将文本缓冲区内容以UNICODE方式写入文件。当使用该过程写入内容的时候,会自动的在尾部追加行终止符。
  2012/12/31 13:50经过测试,会清空原有文件中的内容。
  16、PUTF
  该过程用于以特定的格式将文本内容写入到文件中,其中%s标识字符串,格式\n表示行终止符。语法如下:
  UTL_FILE.PUTF(
  file IN FILE_TYPE,
  format IN VARCHAR2,
  [arg1 IN VARCHAR2 DEFAULT NULL,
  …
  arg5 IN VARCHAR2 DEFAULT NULL]);
  上述format用于指定格式符(最多支持5个%s),arg1…arg5用于指定对应于格式符的字符串。使用该过程的示例如下:
  DECLARE
  HANDLE UTL_FILE.FILE_TYPE;
  BUFFER VARCHAR2(2000);
  BEGIN
  IF NOT UTL_FILE.is_open(HANDLE) THEN
  HANDLE := UTL_FILE.fopen('CZW','DYWT.TXT','W',1000);
  END IF;
  UTL_FILE.PUTF(HANDLE,'%s\n%s\n%s\n','&line1','&line2','&line3');
  UTL_FILE.FCLOSE(HANDLE);
  END;
  17、PUTF_NCHAR
  同上,该过程用于以特定的格式将文本内容以UNICODE方式写入到文件中。
  18、FFLUSH
  该过程用于将数据强制性写入到文件中,正常情况下,当给文件写入数据的时候,数据会被暂时的放到缓存中。过程FFLUSH用于强制将数据写入到文件中。语法如下:
  UTL_FILE.FFLUSH(file IN FILE_TYPE):
  19、FSEEK
  该过程用于移动文件指针到特定的位置。当使用该过程移动文件指针的时候,既可以指定文件指针的绝对位置,也可以指定文件指针的相对位置,语法如下:
  UTL_FILE.FSEEK(
  fid IN utl_file.FILE_TYPE,
  absolute_offset IN PL_INTEGER DEFALUT NULL,
  relative_offset IN PL_INTEGER DEFALUT NULL);
  如上所示,absolute_offset 用于指定文件的绝对位置,relative_offset 用于指定文件的相对位置(单位:字节),使用该过程的示例如下:
  DECLARE
  HANDLE UTL_FILE.FILE_TYPE;
  BUFFER VARCHAR2(2000);
  BEGIN
  IF NOT UTL_FILE.is_open(HANDLE) THEN
  HANDLE := UTL_FILE.fopen('CZW','DYWT.TXT','R',1000);
  END IF;
  DBMS_OUTPUT.PUT_LINE('起始位置'||'==>'||UTL_FILE.FGETPOS(HANDLE));
  UTL_FILE.fseek(HANDLE,5);
  DBMS_OUTPUT.PUT_LINE('现在位置'||'==>'||UTL_FILE.FGETPOS(HANDLE));
  UTL_FILE.FCLOSE(HANDLE);
  END;
  20、FREMOVE
  该过程用于删除磁盘文件。语法如下:
  UTL_FILE.FREMOVE(location IN VARCHAR2,filename IN VARCHAR2);
  上面的location用于指定DIRECTORY,注意,这里也必须要大写,filename用于指定要删除的文件名,示例如下:
  SQL> EXEC UTL_FILE.FREMOVE('CZW','NEW.TXT');
  PL/SQL procedure successfully completed
  21、FCOPY
  该过程用于将源文件的全部或者部分内容复制到目标文件中。当使用该过程的时候,如果不设起始行和结束行,则将复制文件所有的内容。语法如下:
  UTL_FILE.FCOPY(
  location IN VARCHAR2,
  filename IN VARCHAR2,
  dest_dir IN VARCHAR2,
  dest_file IN VARCHAR2,
  start_line IN PLS_INTEGER DEFAULT 1,
  end_line IN PLS_INTEGER DEFALUT NULL);
  上面location用于指定源文件所在的DIRECTORY对象,filename用于指定具体的文件名字,dest_dir指定希望复制到 的文件的directory对象,dest_file用于指定目标文件的名称,start_line用于指定起始行号,end_line用于指定结束行 号。
  下面是UTL_FILE.FCOPY的例子:
  SQL> exec UTL_FILE.FCOPY('CZW','DYWT.TXT','CZW','CZW.TXT');
  PL/SQL procedure successfully completed
  22、FRENAME
  该过程用于修改已经存在的文件名字,其作用于UNIX的MV命令完全相同,在修改文件名字的时候,通过指定overwrite参数可以覆盖已经存在的文件。语法如下:
  UTL_FILE.FRENAME(
  location IN VARCHAR2,
  filename IN VARCHAR2,
  dest_dir IN VARCHAR2,
  dest_file IN VARCHAR2,
  overwrite IN BOOLEAN DEFAULT FALSE);
  上面的,overwrite用于指定是否要覆盖已经存在的文件(false 不覆盖,true可以覆盖)例子如下:
  SQL> exec UTL_FILE.FRENAME('CZW','CZW.TXT','CZW','HANJB.TXT')
  PL/SQL procedure successfully completed
  温习例子:
  使用UTL_FILE包,按照一定的格式,导出数据库中某张表的数据:
  使用具有DBA权限的用户创建DIRECTORY名为"CZW_DIR"
  DECLARE
  HANDLE UTL_FILE.FILE_TYPE;
  BEGIN
  HANDLE := UTL_FILE.FOPEN('CZW_DIR','DEPT.TXT','W',1000);
  FOR I IN (SELECT T.DEPTNO||','||T.DNAME||','||T.LOC AS MSG FROM SCOTT.DEPT T) LOOP
  UTL_FILE.PUT_LINE(HANDLE,I.MSG);
  END LOOP;
  UTL_FILE.FFLUSH(HANDLE);
  UTL_FILE.FCLOSE(HANDLE);
  END;

结帖率:37% (7/19)
发表于 2013-1-22 11:54:06 | 显示全部楼层   北京市北京市
沙发我的~      
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表