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



  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在PL/SQL中,可以使用UTL_FILE包将输出结果写入文件。UTL_FILE是Oracle提供的一个标准包,用于在数据库服务器上读写操作系统文件。 以下是一个简单的示例,演示如何将PL/SQL查询结果输出到文件: 1. 首先,创建一个目录对象,指定要将文件写入的目录。例如,使用以下语句创建一个名为DIR_OUTPUT的目录对象: ```sql CREATE DIRECTORY DIR_OUTPUT AS '/path/to/directory'; ``` 2. 接下来,创建一个存储过程或函数来执行查询并将结果写入文件。以下是一个示例存储过程: ```sql CREATE OR REPLACE PROCEDURE EXPORT_TO_FILE IS file_handle UTL_FILE.FILE_TYPE; output_dir VARCHAR2(100) := 'DIR_OUTPUT';-- 目录对象的名称 file_name VARCHAR2(100) := 'output.txt'; -- 输出文件的名称 query_result SYS_REFCURSOR; data_row TABLE_NAME%ROWTYPE; -- 替换为实际表名 BEGIN -- 打开文件句柄 file_handle := UTL_FILE.FOPEN(output_dir, file_name, 'W'); -- 执行查询 OPEN query_result FOR SELECT * FROM TABLE_NAME; -- 替换为实际表名 -- 循环读取查询结果并将其写入文件 LOOP FETCH query_result INTO data_row; EXIT WHEN query_result%NOTFOUND; -- 将数据写入文件 UTL_FILE.PUT_LINE(file_handle, data_row.column1 || ',' || data_row.column2); -- 替换为实际列名 END LOOP; -- 关闭文件句柄 UTL_FILE.FCLOSE(file_handle); EXCEPTION WHEN OTHERS THEN -- 处理异常 UTL_FILE.FCLOSE(file_handle); RAISE; END; / ``` 请注意,上述示例中的TABLE_NAME和column1、column2应替换为实际的表名和列名。 3. 调用存储过程或函数来执行查询并将结果写入文件: ```sql BEGIN EXPORT_TO_FILE; END; / ``` 执行上述代码后,查询结果将被写入指定的目录和文件中(在此示例中为DIR_OUTPUT/output.txt)。 请注意,使用UTL_FILE包需要具有适当的权限。确保数据库用户具有在指定目录中读写文件的权限。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值