`
53873039oycg
  • 浏览: 837231 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

pl/sql应用之利用utl_file写文件

阅读更多

     上次写了篇利用pl/sql读文件(简单)后,如果不清楚utl_file怎么读文件的,可以参考我上次的博文,今天我写下怎么使用utl_file写文件,首先带上我参考过的文章的链接:

    

http://stackoverflow.com/questions/3750192/how-to-write-to-files-using-utl-file-in-oracle
http://blog.csdn.net/liqfyiyi/article/details/7043942
http://qingyujingyu427.iteye.com/blog/402151
http://www.morganslibrary.org/hci/hci004.html

    废话不多说,上代码:

   

declare
  fHandle UTL_FILE.FILE_TYPE;
begin
 --文件不能使用中文名
  fHandle := UTL_FILE.FOPEN('ORADIR_F_DIR', 'test_write_file.sql', 'w');
  UTL_FILE.PUT(fHandle, '中文测试');
  UTL_FILE.PUT(fHandle, '使用\r\n换行是不行的');
  UTL_FILE.PUT_LINE(fHandle,'');
  --换行方法一:使用chr(10)回车
  UTL_FILE.PUT(fHandle, '我要换行方法一'||chr(10)||'第三行');
  --换行方法二:使用chr(13)换行
  UTL_FILE.PUT(fHandle, '我要换行方法二'||chr(13)||'第四行');
  --换行方法三:使用PUT_LINE
  UTL_FILE.PUT_LINE(fHandle, '我要换行方法三');
  UTL_FILE.PUT_LINE(fHandle, '我是制表符'||chr(9)||'看起来舒服多了');
  --空白行
  UTL_FILE.NEW_LINE(fHandle,1);
  UTL_FILE.PUT(fHandle, '测试');
  UTL_FILE.FCLOSE(fHandle);
EXCEPTION
  WHEN OTHERS THEN
    DBMS_OUTPUT.PUT_LINE('Exception: SQLCODE=' || SQLCODE || '  SQLERRM=' ||
                         SQLERRM);
    RAISE;
end;

   运行结果如下

  

     说明下:ORADIR_F_DIR是目录,怎么建目录的请参考我的博文利用pl/sql读文件(简单),文件名不能为中文,fopen最后一个参数常用的有--r 读 w写 a追加 rb只读字节 wb只写字节,如果不想覆盖文件,请使用a(追加),其他的代码里写的很清楚了。

      utl_file写文件一个常见的功能是记录日志,个人也推荐使用utl_file记录日志:

     

declare
  fHandle UTL_FILE.FILE_TYPE;
  v_out number(3);
begin
  --w覆盖写
  fHandle := UTL_FILE.FOPEN('ORADIR_F_DIR', 'syslog_'||to_char(sysdate,'yyyy_mm_dd')||'.log', 'a');
  UTL_FILE.put_line(fHandle,'输出日志信息');
  v_out:=1/0;
  UTL_FILE.FCLOSE(fHandle);
EXCEPTION
  WHEN OTHERS THEN
    IF utl_file.is_open(fHandle) THEN
    utl_file.PUT_LINE(fHandle,'Exception: SQLCODE=' || SQLCODE || '  SQLERRM=' ||
                         SQLERRM);
    utl_file.fclose(fHandle);
  END IF;
   RAISE;
end;

   结果为:

  

    写文件不仅仅是写日志文件,还可以把数据库里的clob.blob或者查询结果输出为xml,jpg,xls,cvs等后缀的文件,下面一样举例说明:

    (一)输出clob为log文件

   

create or replace procedure proc_write_clob_demo(id number) IS
  sql_stmt   VARCHAR2(100);
  l_content  clob;
  l_fHandler UTL_FILE.FILE_TYPE;
BEGIN
  sql_stmt := 'select content from t_blob_test where id=:id';
  EXECUTE IMMEDIATE sql_stmt
    into l_content
    using id;
   dbms_xslprocessor.clob2file(l_content,'ORADIR_F_DIR','writeclob_'||id||'.log');
  UTL_FILE.FCLOSE(l_fHandler);
EXCEPTION
  WHEN OTHERS THEN
    IF UTL_FILE.IS_OPEN(l_fHandler) THEN
      UTL_FILE.FCLOSE(l_fHandler);
    END IF;
    DBMS_OUTPUT.PUT_LINE('Exception: SQLCODE=' || SQLCODE || '  SQLERRM=' ||
                         SQLERRM);
    RAISE;
END;

   测试方法:

  

call proc_write_clob_demo(148)

    结果为:

  

    这里我说明下,使用dbms_xslprocessor.clob2file输出clob字段为log文件时候,个人测试输出的log文件为1M,输出时间为1.8s,个人感觉应该有速度更快的方法,请知道的朋友告诉我一下。

    (二)输出clob为xml文件

    这里注意下,clob里面放的要是xml文件,或者是XMLTYPE类型的,其他的不行。

   

CREATE OR REPLACE PROCEDURE proc_write_xml_demo (id number) IS
  xml_str            clob;
  xml_file           Utl_File.file_type;
  offset             NUMBER              := 1;
  buffer             varchar2(32767);
  buffer_size        number              := 2000;
begin
  xml_file := utl_file.fopen('ORADIR_F_DIR','writexml_demo.xml','w');
  xml_str := DBMS_XMLGEN.getXML('select content from xmltype_table where id='||id);
  while(offset < dbms_lob.getlength(xml_str))
  loop
     buffer := dbms_lob.substr(xml_str,buffer_size,offset);
     utl_file.put(xml_file,buffer);
     utl_file.fflush(xml_file);
     offset := offset + buffer_size;
  end loop;
  utl_file.fclose(xml_file);
  dbms_lob.freetemporary(xml_str);
end;

 

   测试方法为:

   

call proc_write_xml_demo(4)

    结果为:

   

    (三)输出blob为img

   

CREATE OR REPLACE PROCEDURE PROC_GET_PIC_BLOB (i_xh VARCHAR2) IS
l_file UTL_FILE.FILE_TYPE;
l_buffer RAW(32767);
l_amount BINARY_INTEGER := 32767;
l_pos INTEGER := 1;
l_blob BLOB;
l_blob_len INTEGER;
BEGIN
SELECT image INTO L_BLOB FROM BXXX WHERE id = i_xh;
 l_blob_len := DBMS_LOB.GETLENGTH(l_blob);
 l_file := UTL_FILE.FOPEN('ORADIR_F_DIR',i_xh || '.jpg','WB',32767);
 WHILE l_pos < l_blob_len LOOP
    DBMS_LOB.READ (l_blob, l_amount, l_pos, l_buffer);
    UTL_FILE.PUT_RAW(l_file, l_buffer, TRUE);
    l_pos := l_pos + l_amount;
 END LOOP;
 UTL_FILE.FCLOSE(l_file);
EXCEPTION
 WHEN NO_DATA_FOUND THEN
  DBMS_OUTPUT.put_line('no data : ' || i_xh);
 WHEN OTHERS THEN
  IF UTL_FILE.IS_OPEN(l_file) THEN
   UTL_FILE.FCLOSE(l_file);
  RAISE;
  END IF;
END PROC_GET_PIC_BLOB;

 

   测试方法为:

   

select * from bxxx
call PROC_GET_PIC_BLOB(2)

   结果为:

  

   (四)输出select结果为cvs文件

    

create or replace procedure proc_write_cvs_demo as
  v_file   UTL_FILE.FILE_TYPE;
  v_buffer VARCHAR2(100);
begin
  v_file   := UTL_FILE.FOPEN('ORADIR_F_DIR',
                             'cvsfile' || to_char(sysdate, 'yyyy_mm_dd') ||
                             '.csv',
                             'w',
                             32767);
  v_buffer := '员工编号,姓名,职位,上级,工作时间,薪水,部门';
  UTL_FILE.PUT_LINE(v_file, v_buffer);
  for v in (select '"' || empno || '","' || ename || '","' || job || '","' || mgr ||
                   '","' || to_char(hiredate, 'yyyy-mm-dd') || '","' || sale ||
                   '","' || deptno || '" ' result
              from emp) loop
   UTL_FILE.PUT_LINE(v_file, v.result);
  end loop;
  UTL_FILE.FCLOSE(v_file);
exception
  when others then
    DBMS_OUTPUT.PUT_LINE('Exception: SQLCODE=' || SQLCODE || '  SQLERRM=' ||
                         SQLERRM);
    RAISE;
end;

   测试方法为:

  

call proc_write_cvs_demo()

  结果为:

 

     (五)输出select结果为xls文件

    

create or replace procedure proc_write_xls_demo as
  v_file     UTL_FILE.FILE_TYPE;
  v_buffer   varchar2(100);
  type type_emp is record(
    empno    varchar2(15),
    ename    varchar2(30),
    job      varchar2(15),
    mgr      varchar2(10),
    hiredate varchar2(12),
    sale     varchar2(10),
    deptno   varchar2(10));
  type_empinfo type_emp;
  cursor cur_emp is
    select empno||chr(9),
           ename||chr(9),
           job||chr(9),
           mgr||chr(9),
           to_char(hiredate, 'yyyy-mm-dd')||chr(9),
           sale||chr(9),
           deptno
      from emp
     where rownum <= 10;
begin
--oracle导出到excel时不同的字段用chr(9)就可以起到将不同字段存到不同的excel列上
  v_buffer:='员工编号'||chr(9)||'姓名'||chr(9)||'职位'||chr(9)||'上级'||chr(9)||'工作时间'||chr(9)||'薪水'||chr(9)||'部门';
  v_file     := UTL_FILE.FOPEN('ORADIR_F_DIR', 'xlsfile' || to_char(sysdate, 'yyyy_mm_dd')||'.xls', 'w', 32767);
  utl_file.put_line(v_file, v_buffer);
  open cur_emp;
  loop
    fetch cur_emp
      into type_empinfo;
    exit when cur_emp%notfound;
    utl_file.put(v_file, type_empinfo.empno);
    utl_file.put(v_file, type_empinfo.ename);
    utl_file.put(v_file, type_empinfo.job);
    utl_file.put(v_file, type_empinfo.mgr);
    utl_file.put(v_file, type_empinfo.hiredate);
    utl_file.put(v_file, type_empinfo.sale);
    utl_file.put_line(v_file, type_empinfo.deptno);
    -- utl_file.new_line(v_file,1);
    --强制刷新到文件
    --utl_file.fflush(v_file);
  end loop;
  utl_file.fclose(v_file);
  close cur_emp;
exception
  when others then
    DBMS_OUTPUT.PUT_LINE('Exception: SQLCODE=' || SQLCODE || '  SQLERRM=' ||
                         SQLERRM);
    RAISE;
end;

   测试方法为:

  

call proc_write_xls_demo()

    结果为:

   

    博文只是简单的介绍了如何使用utl_file输出为文件,对于utl_file其他的用法如复制、得到文件属性等没有介绍,感兴趣的朋友请仔细搜索。

    文章写到这里也该结束了,本文系原创,转载请注明出处,对本文有不同意见的请留言指教,谢谢。

 

  • 大小: 26.1 KB
  • 大小: 26.2 KB
  • 大小: 144.7 KB
  • 大小: 141.4 KB
  • 大小: 70 KB
  • 大小: 159.5 KB
  • 大小: 528 KB
1
0
分享到:
评论

相关推荐

    UTL_FILE操作文件代码

    根据给定的信息,本文将详细解释“UTL_FILE操作文件代码”的主要功能及其实现细节。这段代码展示了如何使用Oracle的UTL_FILE包来处理文件的读写操作,并且能够将文件内容存储到数据库的BLOB字段中。下面将对各个部分...

    oracle utl_file包的用法

    `UTL_FILE`是Oracle数据库中一个重要的包,它提供了一套完整的文件输入/输出(I/O)操作接口,允许PL/SQL程序直接读写文件系统中的文件。这使得在Oracle环境中进行文件处理变得简单而直接。然而,使用`UTL_FILE`包前...

    在oracle9i中设置utl_file_dir参数.txt

    在Oracle 9i数据库系统中,`UTL_FILE_DIR`参数是用于控制PL/SQL程序在执行时可以访问的文件目录的重要配置项。这个参数的设置对于实现数据的读写操作、日志记录以及与其他文件系统的交互至关重要。下面将详细探讨...

    utl_file.txt

    在Oracle数据库环境中,UTL_FILE包为PL/SQL程序提供了读写操作系统文本文件的能力。它提供了一个受限版本的操作系统流文件I/O功能,使数据库应用程序能够直接与操作系统级别的文件进行交互。尽管UTL_FILE的I/O能力...

    ORACLE使用UTL_FILE记录日志简介

    Oracle数据库系统提供了丰富的内置工具和包,以满足各种复杂的需求,其中之一就是UTL_FILE包,它允许我们在PL/SQL程序中直接操作文件,包括读取、写入和管理文件。这篇博客将深入介绍如何利用UTL_FILE在Oracle中记录...

    oracle中utl_file包读写文件操作实例学习

    这个包提供了多种函数和过程,使得在PL/SQL中处理文本文件变得简单。下面我们将深入探讨如何使用UTL_FILE进行文件操作。 首先,要在Oracle中使用UTL_FILE,需要创建一个DIRECTORY对象,这实际上是Oracle数据库对...

    PL/SQL ExcelDocumentType

    在PL/SQL中处理这种格式的文件可能需要使用UTL_FILE包,或者如上所述,通过Java存储过程利用Apache POI等第三方库。 在实际应用中,使用PL/SQL操作Excel文件的场景可能包括: 1. 数据迁移:从Excel文件导入大量数据...

    PL/SQL examples

    - `utlfile.ora`:这可能是UTL_FILE包的配置文件,定义了文件操作的一些设置。 - `cah.pkg`:未提供具体描述,可能包含自定义的PL/SQL功能或业务逻辑。 通过这些示例,初学者可以深入了解PL/SQL的语法、流程控制...

    PL/SQL解析、生成XML例子

    通常,这样的例子会包含创建XMLType对象,执行XML查询,以及利用UTL_FILE包进行文件操作的过程。读者可以按照说明中的步骤一步步实践,以加深对PL/SQL和XML交互的理解。 总之,PL/SQL解析XML涉及到XMLType数据类型...

    oralce plsql 使用utl_tcp实现上传文件的功能

    可以使用PL/SQL的文件I/O函数,如`UTL_FILE.GET_LINE`或`UTL_FILE.READ`,来读取文件内容,然后用`UTL_TCP.WRITE_LINE`或`UTL_TCP.WRITE_RAW`将其写入网络连接。 文件传输完成后,记得关闭连接以释放资源: ```sql...

    plsql培训PPT

    通过本次PL/SQL培训,你将能够编写高效、健壮的PL/SQL代码,并利用UTL_FILE包实现与文件系统的交互。这将提升你在数据库管理和应用开发中的专业技能,为日常任务带来更大的便利。在实际工作中,不断实践和应用这些...

    Create Excel Workbook by PL/SQL

    Oracle的UTL_FILE包允许在PL/SQL中操作文件,但不支持直接创建Excel文件。因此,一种常见的做法是将数据写入CSV(逗号分隔值)文件,因为Excel可以轻松地打开和读取这种格式。 ```plsql CREATE OR REPLACE ...

    UTL_FTP:一个PL / SQL软件包-开源

    UTL_FTP是Oracle数据库内置的一个PL/SQL软件包,专为在数据库环境中执行FTP(File Transfer Protocol)任务而设计。这个包允许开发者无需离开Oracle环境就能与远程服务器进行文件的上传、下载以及管理,极大地简化了...

    utl_mail_scheduler

    以上示例展示了如何利用UTL_MAIL和Oracle Scheduler来自动化邮件发送任务及计划性操作,这对于提高系统的可维护性和响应能力具有重要意义。通过这些技术的应用,可以有效地减少人工干预,提升工作效率。

    Oracle数据库通过UTL—FILE实现磁盘文件操作.pdf

    Oracle数据库的UTL_FILE包是一个内置的PL/SQL包,它允许数据库直接访问和操作服务器端的磁盘文件,从而实现数据库与文件系统的交互。这个包提供了一系列过程和函数,如`popen`、`flush`、`put`、`put_line`、`get_...

    pl/sql学习文档

    - **步骤A**:在init.ora文件中设置`UTL_FILE_DIR`参数,以便LogMiner能够访问日志文件。 - **步骤B至G**:执行一系列的DBMS_LOGMNR包中的存储过程,用于分析重做日志文件,提取其中的事务操作信息,常用于数据库...

    plsql.zip_plsql_sql_zip

    PL/SQL是Oracle数据库系统中的一个关键...通过理解和掌握PL/SQL,开发者可以更高效地管理数据库,同时,利用Oracle的UTL_FILE包和其他接口,可以实现与各种文件格式,如ZIP,的交互,增强数据库应用的功能和灵活性。

    Oracle P/L SQL实现文件压缩、解压功能

    Oracle P/L SQL实现文件压缩、解压功能,以下是此过程包的头部,包体经常打包处理plb,感兴趣用户可以下载下来。 Create or Replace Package UTL_ZIP AUTHID CURRENT_USER as Type File_List is Table of Clob; -...

    在oracle9i如何在PL-SQL中读写文件.doc

    在Oracle 9i中,利用PL/SQL进行文件读写是一项高级功能,主要通过UTL_FILE包实现。本文将深入探讨这一主题,包括UTL_FILE包的使用方法、相关函数和异常处理,以及如何创建存储过程来执行文件读写操作。 ### UTL_...

Global site tag (gtag.js) - Google Analytics