使用Oracle数据库BFILE 导入文件到数据库_Oracle数据库_黑客防线网安服务器维护基地--Powered by WWW.RONGSEN.COM.CN

使用Oracle BFILE 导入文件到数据库

作者:黑客防线网安Oracle维护基地 来源:黑客防线网安Oracle维护基地 浏览次数:0

黑客防线网安网讯:如何将文章的正文内容保存在文件中?这导致数据同步和迁移带来了很大的困难,如何将文件的内容重新放进数据库成为了摆在面前的一个问题。经过搜索,发现Oracle有一种数据类型成为BFILE,可以...

如何将文章的正文内容保存在文件中?这导致数据同步和迁移带来了很大的困难如何将文件的内容重新放进数据库成为了摆在面前的一个问题经过搜索发现Oracle有一种数据类型成为BFILE,可以访问外部的文件,并提供了一系列的过程,例如:dbms_lob.LoadFromFile , dbms_lob.LoadClobFromFile 还有 dbms_lob.LoadBlobFromFile , 大概看名字的就能猜到是做什么的了吧

使用BFILE访问文件需要首先在数据库中建立 Directory ,限定访问路径,当然相应的权限也得跟上:

sys$logdw@logserver SQL> create directory cms_data as '/tmp/webapps/cms/cms-data/' ;
sys$logdw@logserver SQL> grant read on cms_data to cms ;
 
我们再看看表结构:
 SQL> desc p_lob_text; 
 Name                   Null?    Type        
 ---------------------- -------- -------------
 LOB_ID                 NOT NULL VARCHAR2(32)
 KEY_INFO                        VARCHAR2(100)
 LOB_CONTENT                     CLOB
 LOB_SIZE                        VARCHAR2(100)
 LINK_TABLE                      VARCHAR2(100)
 LINK_INFO                       VARCHAR2(50)
 LINK_CATEGORY                   VARCHAR2(50)
 CREATION_TIME                   VARCHAR2(30)
 LAST_EDIT_TIME                  VARCHAR2(30)
 VERSION                         NUMBER(38)
 REMARK                          VARCHAR2(500)
 STATIC_FLAG                     VARCHAR2(3)
 DELETE_FLAG                     VARCHAR2(3)
逻辑是这样的,通过lob_id经过变换后可知道文件的位置,然后将该文件导入到对应的clob中。

我写了个过程使用过程、游标进行此操作:

declare
 l_bfile bfile;
 l_clob clob;
 l_lob_id varchar(100);
 l_path varchar(200);
 --
 V_SOURCE NUMBER := 1;
 V_DEST NUMBER := 1;
 V_LANG NUMBER := 0;
 V_WARN NUMBER;
 --
 CURSOR cur is
  select LOB_ID
  from p_lob_text;
begin
 open cur;
 loop
  fetch cur into l_lob_id;
  EXIT when cur%NOTFOUND;
  -- 构建文件路径
  l_path := substr(l_lob_id,0,4)
    ||'/'||substr(l_lob_id,5,2)
    ||'/'||substr(l_lob_id,7,2)
    ||'/'||l_lob_id;
  -- 有些CLOB是NULL,首先得让它变成 empty clob
  update p_lob_text
  set lob_content=empty_clob
  where LOB_ID=l_lob_id
  return lob_content INTO l_clob;
  -- 创建一个bfile对象
  l_bfile := bfilename('CMS_DATA',l_path);
  -- 判断文件是否存在
  if ( dbms_lob.fileexists (l_bfile) = 1 ) then
   -- 重设一些参数
   V_SOURCE := 1;
   V_DEST := 1;
   V_LANG := 0;
   -- 打开文件
   dbms_lob.fileopen(l_bfile);
   if (
    -- 判断文件是否打开
    dbms_lob.fileisopen(l_bfile) = 1
    and
    -- 判断文件的长度是否为了0
    dbms_lob.getlength(l_bfile) >0 
      ) then
     -- 将文件Load到clob字段中
    dbms_lob.loadclobfromfile
     ( l_clob,
       l_bfile,
       DBMS_LOB.LOBMAXSIZE ,
       V_DEST,
       V_SOURCE,
       0,V_LANG,V_WARN
     );
   end if;
   -- 打开文件后一定要记得关闭哦
   dbms_lob.fileclose(l_bfile);
  end if;
  commit;
 end loop;
end;
/

    黑客防线网安服务器维护方案本篇连接:http://www.rongsen.com.cn/show-12734-1.html
网站维护教程更新时间:2012-03-23 00:45:06  【打印此页】  【关闭
我要申请本站N点 | 黑客防线官网 |  
专业服务器维护及网站维护手工安全搭建环境,网站安全加固服务。黑客防线网安服务器维护基地招商进行中!QQ:29769479

footer  footer  footer  footer