oracle存储过程读写文件操作

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

racle提供的文件操作包UTL_FILE包中的UTL_FILE.FOPEN负责打开一个文件。utl_file.fopen(locationinvarchar2,filenameinvarchar2,open_modeinvarchar2)returnFILE_TYPE;Location是路径参数,FILENAME是文件名,OPEN_MODE是打开模式,'R'是读文本,'W'是写文本,'A'是附加文本,参数不分大小写,如果指定'A'但是文件不存在,它会用'W'先创建出来,'W'有覆盖的功能;其中的location并不能简单的指定为'D:/temp'等路径,要建立一个DIRECTORY变量并付给权限(必须以DBA身份登录):Sql代码1.CreateorreplacedirectoryD_OUTPUTas'D:/TEMP';2.grantread,writeondirectoryD_OUTPUTtotestdb;3.GRANTEXECUTEONutl_fileTOtestdb;[sql]viewplaincopy1.createorreplacedirectoryD_OUTPUTas'D:/TEMP';2.grantread,writeondirectoryD_OUTPUTtotestdb;3.GRANTEXECUTEONutl_fileTOtestdb;之后就可以用UTL_FILE包建立文件了Sql代码1.V_FILEUTL_FILE.FILE_TYPE;2.V_FILE:=UTL_FILE.FOPEN('D_OUTPUT','Data.txt','w');[sql]viewplaincopy1.V_FILEUTL_FILE.FILE_TYPE;2.V_FILE:=UTL_FILE.FOPEN('D_OUTPUT','Data.txt','w');就可以在数据库服务器的D:/TEMP建立Data.txt最近用到了Oracle的包UTL_FILE,网上却没找到关于它的函数,过程使用说明,虽然都不是很难的东西,但简单列出来,也能提高些效率。FOPENIS_OPENGET_LINEPUTNEW_LINEPUT_LINEPUTFFFLUSHFCLOSEFCLOSE_ALLUTL_FILE.FOPEN用法FOPEN会打开指定文件并返回一个文件句柄用于操作文件。所有PL/SQL版本:Oracle8.0版及以上:FUNCTIONUTL_FILE.FOPEN(FUNCTIONUTL_FILE.FOPEN(locationINVARCHAR2,locationINVARCHAR2,filenameINVARCHAR2,filenameINVARCHAR2,open_modeINVARCHAR2)open_modeINVARCHAR2,RETURNfile_type;max_linesizeINBINARY_INTEGER)RETURNfile_type;参数location文件地址filename文件名openmode打开文件的模式(参见下面说明)max_linesize文件每行最大的字符数,包括换行符。最小为1,最大为327673种文件打开模式:R只读模式。一般配合UTL_FILE的GET_LINE来读文件。W写(替换)模式。文件的所有行会被删除。PUT,PUT_LINE,NEW_LINE,PUTF和FFLUSH都可使用A写(附加)模式。原文件的所有行会被保留。在最末尾行附加新行。PUT,PUT_LINE,NEW_LINE,PUTF和FFLUSH都可使用打开文件时注意以下几点:文件路径和文件名合起来必须表示操作系统中一个合法的文件。文件路径必须存在并可访问;FOPEN并不会新建一个文件夹。如果你想打开文件进行读操作,文件必须存在;如果你想打开文件进行写操作,文件不存在时,会新建一个文件。如果你想打开文件进行附加操作,文件必须存在。A模式不同于W模式。文件不存在时,会抛出INVALID_OPERATION异常。FOPEN会抛出以下异常UTL_FILE.INVALID_MODEUTL_FILE.INVALID_OPERATIONUTL_FILE.INVALID_PATHUTL_FILE.INVALID_MAXLINESIZEUTL_FILE.IS_OPEN用法如果文件句柄指定的文件已打开,返回TRUE,否则FALSEFUNCTIONUTL_FILE.IS_OPEN(fileINUTL_FILE.FILE_TYPE)RETURNBOOLEAN;UTL_FILE只提供一个方法去读取数据:GET_LINEUTL_FILE.GET_LINE用法读取指定文件的一行到提供的缓存。PROCEDUREUTL_FILE.GET_LINE(fileINUTL_FILE.FILE_TYPE,bufferOUTVARCHAR2);file由FOPEN返回的文件句柄buffer读取的一行数据的存放缓存buffer必须足够大。否则,会抛出VALUE_ERROR异常。行终止符不会被传进buffer。异常NO_DATA_FOUNDVALUE_ERRORUTL_FILE.INVALID_FILEHANDLEUTL_FILE.INVALID_OPERATIONUTL_FILE.READ_ERRORUTL_FILE.PUT用法在当前行输出数据PROCEDUREUTL_FILE.PUT(fileINUTL_FILE.FILE_TYPE,bufferOUTVARCHAR2);file由FOPEN返回的文件句柄buffer包含要写入文件的数据缓存;Oracle8.0.3及以上最大允许32kB,早期版本只有1023BUTL_FILE.PUT输出数据时不会附加行终止符。UTL_FILE.PUT会产生以下异常UTL_FILE.INVALID_FILEHANDLEUTL_FILE.INVALID_OPERATIONUTL_FILE.WRITE_ERRORUTL_FILE.NEW_LINE在当前位置输出新行或行终止符,必须使用NEW_LINE来结束当前行,或者使用PUT_LINE输出带有行终止符的完整行数据。PROCEDUREUTL_FILE.NEW_LINE(fileINUTL_FILE.FILE_TYPE,linesINNATURAL:=1);file由FOPEN返回的文件句柄lines要插入的行数如果不指定lines参数,NEW_LINE会使用默认值1,在当前行尾换行。如果要插入一个空白行,可以使用以下语句:UTL_FILE.NEW_LINE(my_file,2);如果lines参数为0或负数,什么都不会写入文件。NEW_LINE会产生以下异常VALUE_ERRORUTL_FILE.INVALID_FILEHANDLEUTL_FILE.INVALID_OPERATIONUTL_FILE.WRITE_ERROR例子如果要在UTL_FILE.PUT后立刻换行,可以如下例所示:PROCEDUREadd_line(file_inINUTL_FILE.FILE_TYPE,line_inINVARCHAR2)ISBEGINUTL_FILE.PUT(file_in,line_in);UTL_FILE.NEW_LINE(file_in);END;UTL_FILE.PUT_LINE输出一个字符串以及一个与系统有关的行终止符PROCEDUREUTL_FILE.PUT_LINE(fileINUTL_FILE.FILE_TYPE,bufferINVARCHAR2);file由FOPEN返回的文件句柄buffer包含要写入文件的数据缓存;Oracle8.0.3及以上最大允许32kB,早期版本只有1023B在调用UTL_FILE.PUT_LINE前,必须先打开文件。UTL_FILE.PUT_LINE会产生以下异常UTL_FILE.INVALID_FILEHANDLEUTL_FILE.INVALID_OPERATIONUTL_FILE.WRITE_ERROR例子这里利用UTL_FILE.PUT_LINE从表emp读取数据到文件:PROCEDUREemp2fileISfileIDUTL_FILE.FILE_TYPE;BEGINfileID:=UTL_FILE.FOPEN('/tmp','emp.dat','W');/*Quickanddirtyconstructionhere!*/FORemprecIN(SELECT*FROMemp)LOOPUTL_FILE.PUT_LINE(TO_CHAR(emprec.empno)||','||emprec.ename||','||...TO_CHAR(emprec.deptno));ENDLOOP;UTL_FILE.FCLOSE(fileID);END;PUT_LINE相当于PUT后加上NEW_LINE;也相当于PUTF的格式串%s/n。UTL_FILE.PUTF以一个模版样式输出至多5个字符串,类似C中的printfPROCEDUREUTL_FILE.PUTF(fileINFILE_TYPE,formatINVARCHAR2,arg1INVARCHAR2DEFAULTNULL,arg2INVARCHAR2DEFAULTNULL,arg3INVARCHAR2DEFAULTNULL,arg4INVARCHAR2DEFAULTNULL,arg5INVARCHAR2DEFAULTNULL);file由FOPEN返回的文件句柄format决定格式的格式串argN可选的5个参数,最多5个格式串可使用以下样式%s在格式串中可以使用最多5个%s,与后面的5个参数一一对应/n换行符。在格式串中没有个数限制%s会被后面的参数依次填充,如果没有足够的参数,%s会被忽视,不被写入文件UTL_FILE.PUTF会产生以下异常UTL_FILE.INVALID_FILEHANDLEUTL_FILE.INVALID_OPERATIONUTL_FILE.WRITE_ERRORUTL_FILE.FFLUSH确保所有数据写入文件。PROCEDUREUTL_FILE.FFLUSH(fileINUTL_FILE.FILE_TYPE);file由FOPEN返回的文件句柄操作系统可能会缓存数据来提高性能。因此可能调用put后,打开文件却看不到写入的数据。在关闭文件前要读取数据的话可以使用UTL_FILE.FFLUSH。典型的使用方法包括分析执行进度和调试纪录。UTL_FILE.FFLUSH会产生以下异常UTL_FILE.INVALID_FILEHANDLEUTL_FILE.INVALID_OPERATIONUTL_FILE.WRITE_ERRORUTL_FILE.FCLOSE关闭文件PROCEDUREUTL_FILE.FCLOSE(fileINOUTFILE_TYPE);file由FOPEN返回的文件句柄注意file是一个INOUT参数,因为在关闭文件后会设置为NULL当试图关闭文件时有缓存数据未写入文件,会抛出WRITE_ERROR异常UTL_FILE.FCLOSE会产生以下异常UTL_FILE.INVALID_FILEHANDLEUTL_FILE.WRITE_ERRORUTL_FILE.FCLOSE_ALL关闭所有已打开的文件PROCEDUREUTL_FILE.FCLOSE_ALL;在结束程序时要确保所有打开的文件已关闭,可使用FCLOSE_ALL也可以在EXCEPTION使用,当异常退出时,文件也会被关闭。EXCEPTIONWHENOTHERSTHENUTL_FILE.FCLOSE_ALL;...othercleanupactivities...END;注意:当使用FCLOSE_ALL关闭所有文件时,文件句柄并不会标记为NULL,使用IS_OPEN会返回TRUE。但是,那些关闭的文件不能执行读写操作(除非你再次打开文件)。UTL_FILE.FCLOSE_ALL会产生以下异常UTL_FILE.WRITE_E

1 / 7
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功