oracle表中一个字段内容导出到磁盘上

有没有遇到过这样的问题,

系统设计的时候,会把一些内容比较大的文本内容存入到表中(oracle longe类型最大可以存放2G的文本)

刚开始也许不会有什么问题,但是时间长了,数据量大了,经常频繁的insert,update之后,效率开始变低了,

而且备份也会有磁盘大小和备份耗时越来越长的问题。

现在要改变原先的设计

把文本内容导出到一个目录中,每条记录对应一个文件,文件名就使用该记录的主键值,

这样使用exp备份的时候就不要备份这些文本内容了

下面的存储过程,使用Oracle中内置程序包:utl_file

 

-- 使用管理员帐号 sys/password 以 sysdba身份登录
--创建要导出文件存放目录
createorreplace directory ETF AS
'f:/exportHTML/';
/
 
--注意 ‘f:/exportHTML/’ 是指oracle服务器上的磁盘目录,非个人PC客户端的磁盘目录(使用PL/SQL客户端执行的用户别错了)
 
-- 授权

GRANT EXECUTE ON utl_file TO xyl;

GRANT READ ON DIRECTORY ETF TO xyl;

 
--使用 xyl/password 登录继续下面的操作

--创建导出存储过程
--
使用主键值作为文件名称
--
selectSQL: select id,html from mytable
createorreplaceprocedure exportToFile(selectSQL varchar2) as
v_file utl_file.file_type;
v_html
long; --导出字段
v_id varchar2(64); --主键值,文件名称

type refcur_t
is ref cursor;
refcur refcur_t;
begin
--v_dir :
='ETF'; --上面定义的目录名称

open refcur for selectSQL; --打开游标
--
循环游标提取数据
loop
fetch refcur
into v_id, v_html;
exitwhen refcur%notfound;

--打开文件
v_file := utl_file.fopen('ETF', v_id||'.html', 'w');
--写入
utl_file.put(v_file,v_html);
--关闭
utl_file.fclose(v_file);
/**/
end loop;
close refcur; --关闭游标
EXCEPTION
when others then
if utl_file.is_open(v_file) then
utl_file.fclose(v_file);
endif;
end;
/

 

 

posted @ 2010-04-27 12:03  readonly  阅读(685)  评论(0编辑  收藏  举报