用PLSQL中的UTL_FILE包来读写文件

我们知道PLSQL是一门非常强大的语言,上次有用这们语言做过发送邮件的程序,今天我们来看一下,如何用PLSQL来操作文件。

首先我们使用管理员账号来创建一个路径,并将这个路径进行授权给相应的用户。

CREATE OR REPLACE directory file_dir AS 'D:\test'; --windows系统路径
grant READ, WRITE ON directory file_dir TO customerUser; --路径授权,添加对路径读、写权限
grant EXECUTE ON utl_file TO customerUser; --utl_file包授权,添加执行权限

完成上面的授权之后,我们来使用这个customerUser 账号登录进去(如我使用的是PL/SQL Develpoer)。


如何保存数据到文件
这里我们分为三步:打开文件,写入数据,关闭文件

--====保存数据到文件====--
DECLARE
  v_file  utl_file.file_type;
  v_input CLOB := '我是要保存到文件里面的内容';
BEGIN
  --打开文件
  v_file := utl_file.fopen('FILE_DIR', 'data.txt', 'w');
  --将数据写入到文件中
  utl_file.put_line(v_file, v_input);
  --关闭文件
  utl_file.fclose(v_file);
EXCEPTION
  WHEN utl_file.access_denied THEN
    dbms_output.put_line('拒绝访问!');
  WHEN OTHERS THEN
    dbms_output.put_line('SQLERRM: ' || SQLERRM);
END;

注意到上面的打开文件的代码中使用的打开模式是w
这里文件的打开模式有如下三种
W:是写文件,文件不存在则创建文件,如果文件存在则覆盖之前文件的内容
A:是追加,若文件不存在则创建文件,文件存在,则在文件结束后面追加内容
还有一种在读文件的时候会使用
R:读文件,文件不存在报错,文件存在则将文件内容读出来


如何读取文件中的数据
在从文件读取数据的过程我们也分为三步:打开文件,读取文件数据,关闭文件

--====读取文件中的数据====--
DECLARE
  v_file   utl_file.file_type;
  v_output CLOB := '';
BEGIN
  --打开文件
  v_file := utl_file.fopen('FILE_DIR', 'data.txt', 'r');
  --将文件的数据写入到变量中
  utl_file.get_line(v_file, v_output);
  --关闭文件
  utl_file.fclose(v_file);
  --测试输出文件内容
  dbms_output.put_line(v_output);
EXCEPTION
  WHEN utl_file.access_denied THEN
    dbms_output.put_line('拒绝访问!');
  WHEN OTHERS THEN
    dbms_output.put_line('SQLERRM: ' || SQLERRM);
END;

如何拷贝文件中的数据待另外一个文件
这是我们直接使用UTL_FILE 里面的fcopy() 来进行文件的复制操作

--====从一个文件拷贝数据到另外一个文件====--
BEGIN
  utl_file.fcopy(src_location  => 'FILE_DIR',
                 src_filename  => 'src.txt',
                 dest_location => 'FILE_DIR',
                 dest_filename => 'dst.txt',
                 start_line    => '1',
                 end_line      => '4');
EXCEPTION
  WHEN utl_file.access_denied THEN
    dbms_output.put_line('拒绝访问!');
  WHEN OTHERS THEN
    dbms_output.put_line('SQLERRM: ' || SQLERRM);
END;

上面代码中的start_lineend_line 分别表示复制源文件的行数区间,不是必要的字段,默认复制全部内容。


更多的内容可以参考Oracle之UTL_FILE 包用法详解


你可能感兴趣的:([,数据库,SQL/PLSQL,])