pl/sql使用之使用utlITeye - 威尼斯人

pl/sql使用之使用utlITeye

2019年03月30日12时33分21秒 | 作者: 晗昱 | 标签: 文件,办法,输出 | 浏览: 1540

     前次写了篇后,假如不清楚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;

   运转成果如下:

  

     阐明下:ORADIR_F_DIR是目录,怎样建目录的请参阅我的博文,文件名不能为中文,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;

   成果为:

  

    写文件不仅仅是写日志文件,还能够把数据库里的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);

 

   测验办法为:

   

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;

   测验办法为:

  

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;

   测验办法为:

  

call proc_write_xls_demo()

    成果为:

   

    博文仅仅简略的介绍了怎么运用utl_file输出为文件,关于utl_file其他的用法如仿制、得到文件特点等没有介绍,感兴趣的朋友请仔细搜索。

    文章写到这儿也该完毕了,本文系原创,转载请注明出处,对本文有不同定见的请留言指导,谢谢。

 

版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表威尼斯人立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章

阅读排行

  • 1

    pl/sql使用之使用utlITeye

    文件,办法,输出
  • 2
  • 3

    (转)in 和 existITeye

    分区,查询,一个
  • 4

    oracle正则表达式ITeye

    正则表达式,匹配,表达式
  • 5

    SQL句子的优化办法ITeye

    优化,例如,句子
  • 6
  • 7

    Oracle 存储进程的运用ITeye

    存储,进程,参数
  • 8

    Oracle替换表空间ITeye

    空间,新表,包括
  • 9
  • 10