PLSQL将数据写入指定文件(读写文件)

1、登陆sys或者sysdate创建文件路径并授权给用户user_01

create directory FILEPATH as 'D:\test'  --创建一个路径FILEPATH
grant read,write on directory FILEPATH to user_01; --给用户user_01授予路径读写的权限

2、在指定路径下创建文件夹(如:D:\test),并在该文件夹下面创建需要写入数据的文件(如:122.txt)

3、登陆被授予读写权限的用户,进行读写操作

DECLARE
l_file utl_file.file_type; --定义一个文件变量l_file,类型是file_type

BEGIN
l_file := utl_file.fopen('FILEPATH', '122.txt', 'W'); --给文件变量赋予一个初值122.txt,最后一个参数W表示写入
for i in 
(select a.id||'    '||a.name||'    '||a.time result from table1 a)
loop
utl_file.put_line(l_file,i.result);
end loop;
utl_file.fclose(l_file);--关闭文件

END;

4、在文件122.txt中可查看写入的结果


5、知识点:UTL_FILE包

(1)UTL_FILE:是ORACLE提供的一个用来读写文件的标准工具包

(2)路径:使用包UTL_FILE读写操作系统的文件,首先需要创建路径(directory)并给用户授读写权限,ORACLE目录(路径)的作用就是让数据库与操作系统进行文件的交互;

创建目录(路径)的用户必须具有DBA角色或者被赋予CREATE ANY DIRECTORY权限,如果普通用户被赋予CREATE ANY DIRECTORY权限,那该用户就自动具备路径的读写权限;

创建路径:create directory FILEPATH as 'D:\test';

路径读写授权:grant read,write on directory FILEPATH to user_01;

utl_file包执行授权:grant execute on utl_file to user_01;

(3)file_type:UTL_FILE包中定义的记录类型,其成员是私有的,不能直接调用

(4)fopen:用于打开文件的函数,最多可以打开50个文件

       语法:utl_file.fopen( location in varchar2, --文件路径,必须使用directory对象,且名称必须为大写

                                      filename in varchar2,--文件名称

                                      mode in  varchar2,--打开模式

                                       max_linesize in varchar2 --指定文件每行存放的最大字符数

                                       );

                    return file_type;--返回预操作文件的指针(句柄)

 注:打开模式有'w'、'r'、'a'、'wb'、'rb'、'ab'共6种

     'w':写文件(文本),该文件不存在的话会自动创建,存在的话会覆盖原文件

     'r':读文件(文本),该文件必须存在,否则会报错

      'a':追加文件(文本),该文件若不存在,会以write模式创建此文件

      带'b'后缀的为使用byte(字节)模式,BOLB和varchar2不一样,当文件为BOLB对象时,打开模式必须选择带'b'后缀的模式

(5) is_open:用于判断文件是否已打开的函数

    utl_file.is_open(

        file in file_type --指定文件的句柄,

        );

      return boolean;--如果已经打开返回ture,否则返回fulse

(6)fclose:用于关闭已打开文件的函数

        utl_file.fclose(file in\out file_type);

        fclose_all:用于关闭当前所有打开文件的函数

        utl_file.fclose_all;

(7)put_line:用于将文本缓冲区内容写入到文件中的函数,当使用该函数为文本追加内容时,会自动在文本的尾部追加行终止符

        utl_file.put_line(

            file in file_type;--文件指针(句柄)

            buffer in varchar2;--指定存放数据的缓冲区

            autoflush in boolean default false;--指定是否自动刷新缓冲区数据

        )

(8)get_line:用于读取已打开文件的行数据,行数据会被读取到输出缓冲区

  1. UTL_FILE.GET_LINE(  
  2.   file IN FILE_TYPE,    -- 文件句柄  
  3.   buffer OUT VARCHAR2,    -- 存储读取的Buff  
  4.   linesize IN NUMBER,    -- 读取的最大字节数  
  5.   len IN PLS_INTEGER DEFAULT NULL    -- 实际读取长度    
  6. );

(9)get_raw:用于从文件中读取raw字符串,并调节文件指针到读取位置

  1. UTL_FILE.GET_RAW(  
  2.   fid IN UTL_FILE.TYPE,    -- 文件句柄  
  3.   r  OUT NOCOPY RAW,    -- 读取的缓存Buff  
  4.   len IN PLS_INTEGER DEFAULT NULL    -- 读取长度  
  5. );

(10)put:将缓冲区中内容写入文件的函数,使用该函数时,文件必须以写模式打开

  1. UTL_FILE.PUT(  
  2.     file IN FILE_TYPE,  
  3.     buffer IN VARCHAR2  
  4. ); 

(11)put_raw:将raw缓冲区中的内容写入文件的函数

            utl_file.put_raw(

                file in file_type;

                r in raw;--指定存放raw数据的缓冲区

                autoflush in boolean default false; --指定是否自动刷新缓冲区数据

            )

(12)new_line:为文件增加行终止符的函数

            utl_file.new_line(

                file in file_type;

                lines in natrual :=1;--指定在文件中增加行终止符的个数

            )

(13)fflush:强制将数据写入文件中的函数(正常情况下,给文件写入数据时,会将数据暂时先存放在缓冲区中)

            utl_file.fflush(file in file_type;)

(14)fremove:用于删除磁盘文件

        utl_file.fremove(

            location in varchar2;--指定路径,必须大写

            filename in varchar2;--指定要删除的文件名

        )

(15)fcopy:用于将源文件的全部或部分内容复制到目标文件中,在使用该函数的过程中,如果不设置起始行和结束行,将复制文件所有内容

    UTL_FILE.FCOPY(  

       location IN VARCHAR2,    -- 指定源DIRECTORY路径对象  

       filename IN VARCHAR2,    -- 指定文件名  

       dest_dir IN VARCHAR2,    -- 希望复制到的Directory路径对象  

       dest_file IN VARCHAR2,    -- 复制后的文件名  

       start_line IN PLS_INTEGER DEFAULT 1,    -- 指定起始行号  

       end_line IN PLS_INTEGER DEFALUT NULL    -- 指定结束行号

     );

(16)frename:用于修改已存在的文件名称

    UTL_FILE.FRENAME(  

       location IN VARCHAR2,  

       filename IN VARCHAR2,  

       dest_dir IN VARCHAR2,  

       dest_file IN VARCHAR2,  

       overwrite IN BOOLEAN DEFAULT FALSE    -- 是否覆盖已经存在的文件  ); 



猜你喜欢

转载自blog.csdn.net/cc_0101/article/details/79984447