- Rongsen.Com.Cn 版权所有 2008-2010 京ICP备08007000号 京公海网安备11010802026356号 朝阳网安编号:110105199号
- 北京黑客防线网安工作室-黑客防线网安服务器维护基地为您提供专业的
服务器维护
,企业网站维护
,网站维护
服务 - (建议采用1024×768分辨率,以达到最佳视觉效果) Powered by 黑客防线网安 ©2009-2010 www.rongsen.com.cn
作者:黑客防线网安Oracle维护基地 来源:黑客防线网安Oracle维护基地 浏览次数:0 |
如何将文章的正文内容保存在文件中?这导致数据同步和迁移带来了很大的困难,如何将文件的内容重新放进数据库成为了摆在面前的一个问题。经过搜索,发现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;
/
我要申请本站:N点 | 黑客防线官网 | |
专业服务器维护及网站维护手工安全搭建环境,网站安全加固服务。黑客防线网安服务器维护基地招商进行中!QQ:29769479 |