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

https://blog.csdn.net/cc_0101/article/details/79984447

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:用于读取已打开文件的行数据,行数据会被读取到输出缓冲区

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

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

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

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

    UTL_FILE.PUT(  
        file IN FILE_TYPE,  
        buffer IN VARCHAR2  
    );

(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 default 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    -- 是否覆盖已经存在的文件  );

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值