• 利用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;

      /

      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 行操作文件了


  • 相关阅读:
    漫谈递归转非递归
    (转)程序猿面试需要的知识点总结
    LeetCode:4_Median of Two Sorted Arrays | 求两个排序数组的中位数 | Hard
    LeetCode: 3_Longest Substring Without Repeating Characters | 求没有重复字符的最长子串的长度 | Medium
    LeetCode: 221_Maximal Square | 二维0-1矩阵中计算包含1的最大正方形的面积 | Medium
    LeetCode: 2_Add Two Numbers | 两个链表中的元素相加 | Medium
    算法导论第十五章 动态规划
    AVL树探秘
    算法导论第十四章 数据结构的扩张
    算法导论第十三章 红黑树
  • 原文地址:https://www.cnblogs.com/cuihongyu3503319/p/960913.html
Copyright © 2020-2023  润新知