当前位置:数据库 > Oracle >>

[Oracle学习]ORACLE的UTL_FILE包简析

[Oracle学习]ORACLE的UTL_FILE包简析
 
包UTL_FIle用于读写操作系统的文件,前提是首先创建Directory对象、授权。然后就可以使用UTL_FILE包中提供的类型、过程、函数来读取,写入,操作目录中的文件了。
   www.zzzyk.com  
创建Directory的示例如下:
 
SQL> CREATE DIRECTORY CZW AS 'D:\';
Directory created
SQL> GRANT READ,WRITE ON DIRECTORY CZW TO SCOTT;
Grant succeeded
 
1、FILE_TYPE  www.zzzyk.com  
该类型是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
该过程用于以特定的格式将文本内容写入到文件
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,