陋室铭
永远也不要停下学习的脚步(大道至简至易)

摘要:本文主要讨论如何利用Oracle的UTL_FILE包来实现对磁盘文件的I/O操作。

  文件I/O对于数据库的开发来说显得很重要,比如如果数据库中的一部分数据来自于磁盘文件,那么就需要使用I/O接口把数据导入到数据库中来。在PL/SQL中没有直接的I/O接口,一般在调试程序时可以使用Oracle自带的DBMS_OUTPUT包的put_line函数(即向屏幕进行I/O操作)即可,但是对于磁盘文件的I/O操作它就无能为力了。其实Oracle同样也提供了可以进行文件I/O的实用包-----UTL_FILE包,利用这个实用包提供的函数来实现对磁盘的I/O操作。

  1. 准备工作

  由于Oracle数据库对包创建的目录有一个安全管理的问题,所以并不是所有的文件目录能够被UTL_FILE包所访问,要更新这种目录设置,就得到init.ora里将UTL_FILE_DIR域设置为*,这样UTL_FILE包就可以对所有的目录文件进行访问了。

  2. 文件I/O的实施

  UTL_FILE包提供了很多实用的函数来进行I/O操作,主要有以下几个函数:

  fopen

  打开指定的目录路径的文件。

  get_line

  获取指定文件的一行的文本。

  put_line

  向指定的文件写入一行文本。

  fclose

  关闭指定的文件。

  下面利用这些函数,实现从文件取数据,然后将数据写入到相应的数据库中。

 

 

 

  create or replace procedure loadfiledata(p_path varchar2,p_filename varchar2) as

 

  v_filehandle utl_file.file_type; --定义一个文件句柄

  v_text varchar2(100); --存放文本

  v_name test_loadfile.name%type;

  v_addr_jd test_loadfile.addr_jd%type;

  v_region test_loadfile.region%type;

  v_firstlocation number;

  v_secondlocation number;

  v_totalinserted number;

  begin

  if (p_path is null or p_filename is null) then

  goto to_end;

  end if;

  v_totalinserted:=0;

  /*open specified file*/

  v_filehandle:=utl_file.fopen(p_path,p_filename,'r');

  loop

  begin

  utl_file.get_line(v_filehandle,v_text);

  exception

  when no_data_found then

  exit;

  end ;

  v_firstlocation:=instr(v_text,',',1,1);

  v_secondlocation:=instr(v_text,',',1,2);

  v_name:=substr(v_text,1,v_firstlocation-1);

  v_addr_jd:=substr(v_text,v_firstlocation+1,v_secondlocation-v_firstlocation-1);

  v_region:=substr(v_text,v_secondlocation+1);

  /*插入数据库操作*/

  insert into test_loadfile

  values (v_name,v_addr_jd,v_region);

  commit;

  end loop;

  <<to_end>>

  null;

  end loadfiledata;

  /

 

  3. 测试环境

  首先要创建一个目标表TEST_LOADFILE,它用来存储文件中的数据:

 

 

 

  CREATE TABLE TEST_LOADFILE (

 

  NAME VARCHAR2 (100) NOT NULL,

  ADDR_JD VARCHAR2 (20),

  REGION VARCHAR2 (6) ) ;

 

  然后就可以在sqlplus里输入如下的代码并执行即可。

 

 

 

  declare

 

  v_path varchar2(200);

  v_filename varchar2(200);

  begin

  v_path:='F:\ ';

  v_filename:='地址信息.txt';

  loadfiledata(v_path,v_filename);

  end;

  /

 

  需要注意的是,这里我的调试路径为“f:\”地址,如果读者自己建立实验环境,应该设置为的“地址信息”文件的路径

  整个调试环境是:

  服务器端:UNIX操作系统+Oracle9i数据库服务器,

  客户端: sqlplus,操作系统为WIN2000。

  4. 小结

  Oracle本身提供了大量使用的包,如UTL_HTTP包,DBMS_OUTPUT包等,这些包分别封装了不同的功能,它们使得进行大量的应用程序开发的可能,从而拓展了Oracle的功能。


create or replace procedure test_error
(
str out varchar2,
str2 out varchar2
)
as
begin
  declare
    isto_file utl_file.file_type;
    err_num number;
    i number;
    k number;
    m number;
    err_msg varchar2(100);
    fp_buffer varchar2(4000);
  begin
    isto_file := utl_file.fopen('IST0_DIR', 'kj021320.txt', 'W');
    i:=0;
    while (i<2)
    loop
    utl_file.put_line(isto_file, 'My');
    i:=i+1;
    end loop;
    utl_file.fflush(isto_file);
    utl_file.fclose(isto_file);
   
   
    isto_file := utl_file.fopen('IST0_DIR', 'kj021320.txt', 'a');
    m:=0;
    while (m<2)
    loop
    utl_file.put_line(isto_file, 'My');
    m:=m+1;
    end loop;
    utl_file.fflush(isto_file);
    utl_file.fclose(isto_file);
   
    isto_file := utl_file.fopen('IST0_DIR', 'kj021320.txt', 'R');
    str2:='';
    loop
    utl_file.get_line (isto_file , fp_buffer );
    str2:=str2 || fp_buffer;
    end loop;
    utl_file.fclose(isto_file);      

    for j in 1..10  /* for */
    loop
      k:=11;
    end loop;
  EXCEPTION
  WHEN OTHERS THEN
    err_num:=sqlcode; /* 異常num */
    err_msg:=substr(sqlerrm,1,100); /* 異常msg */
    str:=substr(sqlerrm,1,100);
  end;
end test_error;


首先我得先建立一个 ORACLE的目录对象 指向 C:"

create or replace directory IST0_DIR as ’C:"’;

--
然后我们对这个目录对行授实这步可以忽略

grant read, write on directory IST0_DIR to
;

--
以上前奏完成了! 我可以写PLSQL 行操作文件了


posted on 2007-11-15 20:37  宏宇  阅读(440)  评论(2编辑  收藏  举报