利用Oracle的UTL_FILE包来实现对磁盘文件的I/O操作

摘要:本文主要讨论如何利用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; 
  
  
  
  可以不用在init.ora中改的 
  只要用管理员的权限登陆,执行: 
  create   directory   UTL_FILE_TEST   as   '\*'   
  应该就可以了,不用新启动oracle的 
  不过其他用户要使用此目录要授权的 
  / 
  
  
  grant   create   any   directory   to   scott; 
    grant   create   any   library   to   scott; 
    create   or   replace   directory   utllobdir   as   'C:\ep'; 
  
  
  在initsid.ora文件中,加入或修改 
      设置utl_file_dir的要点: 
    1。   utl_file_dir=*     这表示你能操作任何目录,尽量不要用 
    2。   utl_file_dir=d:\   这表示你能操作d:\目录下的文件,但你不能操作d:\目录下的子目录 
    3。注意在设置 
      utl_file_dir=路径时,如果路径是长路径名,例如c:\my   temp目录,则你必须加上'',例如: 
      utl_file_dir='c:\my   temp' 
    4。utl_file_dir可以是多个路径 
          utl_file_dir=c:\,d:\,d:\temp,'c:\my   temp' 
    5。设置完必须重新启动数据库

 

================================================

 

命令设置:

system@oracle9i as sysdba

 

user:system

pwd:******

数据库:oracle9i

连接为:sysdba

执行命令:

alter system set utl_file_dir='D:\exportDataTest' scope=spfile;
grant execute on utl_file to scott;

 

服务器关闭-重启

(

(1) 以oracle身份登录数据库,命令:su – oracle
(2) 进入Sqlplus控制台,命令:sqlplus /nolog
(3) 以系统管理员登录,命令:connect / as sysdba

(4) 启动数据库,命令:startup
(5) 如果是关闭数据库,命令:shutdown immediate
(6) 退出sqlplus控制台,命令:exit
(7) 进入监听器控制台,命令:lsnrctl
(8) 启动监听器,命令:start
(9) 退出监听器控制台,命令:exit
(10) 重启数据库结束

)

登陆scott,就可以用utl_file包对路径'D:\exportDataTest' 进行文件的输入输出操作

 

你可能感兴趣的:(oracle,sql,C++,c,C#)