oracle表中一个字段内容导出到磁盘上
有没有遇到过这样的问题,
系统设计的时候,会把一些内容比较大的文本内容存入到表中(oracle longe类型最大可以存放2G的文本)
刚开始也许不会有什么问题,但是时间长了,数据量大了,经常频繁的insert,update之后,效率开始变低了,
而且备份也会有磁盘大小和备份耗时越来越长的问题。
现在要改变原先的设计
把文本内容导出到一个目录中,每条记录对应一个文件,文件名就使用该记录的主键值,
这样使用exp备份的时候就不要备份这些文本内容了
下面的存储过程,使用Oracle中内置程序包:utl_file
-- 使用管理员帐号 sys/password 以 sysdba身份登录
--创建要导出文件存放目录
createorreplace directory ETF AS
'f:/exportHTML/';
/
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;
/