`

UTL_FILE

阅读更多
最近用到了Oracle的包UTL_FILE,网上却没找到关于它的函数,过程使用说明,虽然都不是很难的东西,但简单列出来,也能提高些效率。
于是有了这篇文。
以下翻译来自《Oracle Built-in Packages》的第六章,只翻译了部分,想了解的更详细,请参考原文。http://www.oreilly.com/catalog/oraclebip/chapter/ch06.html

FOPEN
IS_OPEN
GET_LINE
PUT
NEW_LINE
PUT_LINE
PUTF
FFLUSH
FCLOSE
FCLOSE_ALL

UTL_FILE.FOPEN 用法
FOPEN会打开指定文件并返回一个文件句柄用于操作文件。
所有PL/SQL版本:                 Oracle 8.0版及以上:
FUNCTION UTL_FILE.FOPEN (      FUNCTION UTL_FILE.FOPEN (
    location     IN VARCHAR2,      location     IN VARCHAR2,
    filename     IN VARCHAR2,      filename     IN VARCHAR2,
    open_mode    IN VARCHAR2)      open_mode    IN VARCHAR2,
RETURN file_type;                 max_linesize IN BINARY_INTEGER)
                                RETURN file_type;

参数

location
文件地址

filename
文件名

openmode
打开文件的模式(参见下面说明)

max_linesize
文件每行最大的字符数,包括换行符。最小为1,最大为32767

3种文件打开模式:
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_MODE
UTL_FILE.INVALID_OPERATION
UTL_FILE.INVALID_PATH
UTL_FILE.INVALID_MAXLINESIZE

UTL_FILE.IS_OPEN用法
如果文件句柄指定的文件已打开,返回TRUE,否则FALSE

FUNCTION UTL_FILE.IS_OPEN (file IN UTL_FILE.FILE_TYPE) RETURN BOOLEAN;

UTL_FILE只提供一个方法去读取数据:GET_LINE

UTL_FILE.GET_LINE用法
读取指定文件的一行到提供的缓存。
PROCEDURE UTL_FILE.GET_LINE
   (file IN UTL_FILE.FILE_TYPE,
    buffer OUT VARCHAR2);

file
由FOPEN返回的文件句柄

buffer
读取的一行数据的存放缓存

buffer必须足够大。否则,会抛出VALUE_ERROR 异常。行终止符不会被传进buffer。

异常
NO_DATA_FOUND
VALUE_ERROR
UTL_FILE.INVALID_FILEHANDLE
UTL_FILE.INVALID_OPERATION
UTL_FILE.READ_ERROR


UTL_FILE.PUT用法
在当前行输出数据
PROCEDURE UTL_FILE.PUT
    (file IN UTL_FILE.FILE_TYPE,
    buffer OUT VARCHAR2);
file
由FOPEN返回的文件句柄
buffer
包含要写入文件的数据缓存;Oracle8.0.3及以上最大允许32kB,早期版本只有1023B

UTL_FILE.PUT输出数据时不会附加行终止符。

UTL_FILE.PUT会产生以下异常
UTL_FILE.INVALID_FILEHANDLE
UTL_FILE.INVALID_OPERATION
UTL_FILE.WRITE_ERROR

UTL_FILE.NEW_LINE
在当前位置输出新行或行终止符,必须使用NEW_LINE来结束当前行,或者使用PUT_LINE输出带有行终止符的完整行数据。

PROCEDURE UTL_FILE.NEW_LINE
   (file IN UTL_FILE.FILE_TYPE,
    lines IN NATURAL := 1);
file
由FOPEN返回的文件句柄
lines
要插入的行数

如果不指定lines参数,NEW_LINE会使用默认值1,在当前行尾换行。如果要插入一个空白行,可以使用以下语句:
UTL_FILE.NEW_LINE (my_file, 2);
如果lines参数为0或负数,什么都不会写入文件。

NEW_LINE会产生以下异常
VALUE_ERROR
UTL_FILE.INVALID_FILEHANDLE
UTL_FILE.INVALID_OPERATION
UTL_FILE.WRITE_ERROR
例子
如果要在UTL_FILE.PUT后立刻换行,可以如下例所示:
PROCEDURE add_line (file_in IN UTL_FILE.FILE_TYPE, line_in IN VARCHAR2)
IS
BEGIN
   UTL_FILE.PUT (file_in, line_in);
   UTL_FILE.NEW_LINE (file_in);
END;


UTL_FILE.PUT_LINE
输出一个字符串以及一个与系统有关的行终止符
PROCEDURE UTL_FILE.PUT_LINE
    (file IN UTL_FILE.FILE_TYPE,
    buffer IN VARCHAR2);
file
由FOPEN返回的文件句柄
buffer
包含要写入文件的数据缓存;Oracle8.0.3及以上最大允许32kB,早期版本只有1023B
在调用UTL_FILE.PUT_LINE前,必须先打开文件。
UTL_FILE.PUT_LINE会产生以下异常
UTL_FILE.INVALID_FILEHANDLE
UTL_FILE.INVALID_OPERATION
UTL_FILE.WRITE_ERROR

例子
这里利用UTL_FILE.PUT_LINE从表emp读取数据到文件:
PROCEDURE emp2file
IS
   fileID UTL_FILE.FILE_TYPE;
BEGIN
   fileID := UTL_FILE.FOPEN ('/tmp', 'emp.dat', 'W');

   /* Quick and dirty construction here! */
   FOR emprec IN (SELECT * FROM emp)
   LOOP
      UTL_FILE.PUT_LINE
         (TO_CHAR (emprec.empno) || ',' ||
          emprec.ename || ',' ||
          ...
          TO_CHAR (emprec.deptno));
   END LOOP;

   UTL_FILE.FCLOSE (fileID);
END;
PUT_LINE相当于PUT后加上NEW_LINE;也相当于PUTF的格式串"%s\n"。

UTL_FILE.PUTF
以一个模版样式输出至多5个字符串,类似C中的printf

PROCEDURE UTL_FILE.PUTF
    (file IN FILE_TYPE
    ,format IN VARCHAR2
    ,arg1 IN VARCHAR2 DEFAULT NULL
    ,arg2 IN VARCHAR2 DEFAULT NULL
    ,arg3 IN VARCHAR2 DEFAULT NULL
    ,arg4 IN VARCHAR2 DEFAULT NULL
    ,arg5 IN VARCHAR2 DEFAULT NULL);
file
由FOPEN返回的文件句柄
format
决定格式的格式串
argN
可选的5个参数,最多5个

格式串可使用以下样式
%s
在格式串中可以使用最多5个%s,与后面的5个参数一一对应
\n
换行符。在格式串中没有个数限制
%s会被后面的参数依次填充,如果没有足够的参数,%s会被忽视,不被写入文件

UTL_FILE.PUTF会产生以下异常
UTL_FILE.INVALID_FILEHANDLE
UTL_FILE.INVALID_OPERATION
UTL_FILE.WRITE_ERROR

UTL_FILE.FFLUSH
确保所有数据写入文件。
PROCEDURE UTL_FILE.FFLUSH (file IN UTL_FILE.FILE_TYPE);
file
由FOPEN返回的文件句柄

操作系统可能会缓存数据来提高性能。因此可能调用put后,打开文件却看不到写入的数据。在关闭文件前要读取数据的话可以使用UTL_FILE.FFLUSH。
典型的使用方法包括分析执行进度和调试纪录。
UTL_FILE.FFLUSH会产生以下异常
UTL_FILE.INVALID_FILEHANDLE
UTL_FILE.INVALID_OPERATION
UTL_FILE.WRITE_ERROR

UTL_FILE.FCLOSE
关闭文件
PROCEDURE UTL_FILE.FCLOSE (file IN OUT FILE_TYPE);
file
由FOPEN返回的文件句柄

注意file是一个IN OUT参数,因为在关闭文件后会设置为NULL
当试图关闭文件时有缓存数据未写入文件,会抛出WRITE_ERROR异常

UTL_FILE.FCLOSE会产生以下异常
UTL_FILE.INVALID_FILEHANDLE
UTL_FILE.WRITE_ERROR

UTL_FILE.FCLOSE_ALL
关闭所有已打开的文件
PROCEDURE UTL_FILE.FCLOSE_ALL;

在结束程序时要确保所有打开的文件已关闭,可使用FCLOSE_ALL
也可以在EXCEPTION使用,当异常退出时,文件也会被关闭。
EXCEPTION
   WHEN OTHERS
  
THEN
      UTL_FILE.FCLOSE_ALL;
      ... other clean up activities ...
END;

注意:当使用FCLOSE_ALL关闭所有文件时,文件句柄并不会标记为NULL,使用IS_OPEN会返回TRUE。但是,那些关闭的文件不能执行读写操作(除非你再次打开文件)。
UTL_FILE.FCLOSE_ALL会产生以下异常
UTL_FILE.WRITE_ERROR

分享到:
评论

相关推荐

    utl_file包介绍

    如果路径和文件名均合法,则该文件被打开到一个 file_type 中,然后可以进行各种操作,最后使用 FCLOSE 函数将其关闭。 UTL_FILE 包提供了多种操作,包括读取文件、写入文件、删除文件、重命名文件等。同时,UTL_...

    UTL_FILE用法详解

    `FUNCTION UTL_FILE.GET_LINE (file IN UTL_FILE.FILE_TYPE, line OUT VARCHAR2) RETURN BOOLEAN;` 其中,file 是文件句柄,line 是读取的行内容。如果读取成功,返回 TRUE,否则 FALSE。 其他 UTL_FILE 函数 ----...

    oracle utl_file包的用法

    然而,使用`UTL_FILE`包前,需确保数据库用户拥有足够的操作系统权限,并且在`init.ora`文件中正确配置了`UTL_FILE_DIR`参数。 #### 创建文件目录 在使用`UTL_FILE`之前,必须首先创建一个数据库目录对象。这可以...

    UTL_FILE操作文件代码

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

    在oracle9i中设置utl_file_dir参数.txt

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

    Oracle UTL_FILE的使用

    Oracle学习]ORACLE的UTL_FILE包简析 包UTL_FIle用于读写操作系统的文件,前提是首先创建Directory对象、授权。然后就可以使用UTL_FILE包中提供的类型、过程、函数来读取

    utl_file.txt

    在过去,UTL_FILE函数的可访问目录是通过初始化文件中的`UTL_FILE_DIR`参数指定的,但这种方法不推荐使用,因为存在安全风险。现在建议使用`CREATE DIRECTORY`特性来替代`UTL_FILE_DIR`,这不仅提供了更多的灵活性和...

    ORACLE使用UTL_FILE记录日志简介

    在这个例子中,我们首先声明了一个UTL_FILE.FILE_TYPE类型的变量`l_file`来代表文件句柄。接着,我们调用`UTL_FILE.FOPEN`函数打开或创建文件,参数分别为目录对象名、文件名、打开模式('W'表示写入,如果文件存在...

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

    filehandle UTL_FILE.FILE_TYPE; BEGIN filehandle := UTL_FILE.FOPEN('TESTFILE', 'hello.txt', 'w'); UTL_FILE.PUT_LINE(filehandle, 'Hello Oracle!'); UTL_FILE.PUT_LINE(filehandle, 'Hello World!'); UTL...

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

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

    utl_mail_scheduler

    Create Or Replace Procedure send_mail_file Is Begin utl_mail.send_attach_varchar2( sender => 'mymail@oracle.com', recipients => 'you@oracle.com', message => 'Test', subject => 'Hello', mime_...

    matlab代码中fnames-utl_file_and_directory_utilities_for_all_operating_syst

    utl_file_and_directory_utilities_for_all_operating_systems 关键字:sas sql join合并大数据分析宏oracle teradata mysql sas社区stackoverflow statistics人工智慧AI Python R Java Javascript WPS Matlab SPSS ...

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

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

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

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

    UTL-FILE导出使用说明

    UTL_FILE是oracle提供的一个标准的工具包,用来读写文件使用。UTL_FILE的优点是速度快,可以通过plsql 数据块快速将数据库表导出来,字段以逗号分隔(可以自定义)1、需要先授权2、拼接要导出表的字段3、执行plsql...

    Oracle数据库中业务数据文本导出.pdf

    在这个示例中,'DUMP_DIR'是UTL_FILE_DIR参数中定义的目录,'output.txt'是目标文件名,'W'表示写入模式,32767是缓冲区大小。 值得注意的是,由于UTL_FILE包直接操作文件,因此在处理大量数据时,可能需要考虑性能...

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

    FILE_HANDLE UTL_FILE.FILE_TYPE; TEXT_BUFFER VARCHAR2(1000); LINE_NUM NUMBER; BEGIN DBMS_OUTPUT.PUT_LINE('INPUT PATH=' || FPATH); DBMS_OUTPUT.PUT_LINE('INPUT FILENAME=' || FNAME); LINE_NUM := 0; ...

Global site tag (gtag.js) - Google Analytics