如何在Oracle里用存储过程定期分割表

文章作者 100test 发表时间 2007:03:14 13:59:00
来源 100Test.Com百考试题网


Oracle数据库里存放着各种各样的数据,其中有一些数据表会随着时间的推移,越来越大。如交友聊天的日志、短信收发的日志、生产系统的日志、动态网站发布系统的日志等等。这样的信息又和时间紧密相关,有没有办法让这些日志表能按时间自动分割成历史年月(如log200308,log200309)的表呢? 请看看我用存储过程定期分割表的方法吧。

一、问题的引出

1.初学数据库时只知道用0delete来删除表里的数据。但在Oracle数据库里,大量0delete记录后,并不能释放表所占用的物理空间,这里面有一个高水位的概念,所以我们不能用0delete来分割表。

2.用重命名(rename)表的方法

(1) 先建一个和原来日志表(假如是log)数据结构一模一样的新表(如log_new),建约束、索引及指定字段的默认值.

(2) 重命名表log到log_YYYYMM.

要注意的问题是OLTP系统可能会因为DML操作阻碍重命名执行成功,出现ORA-00054资源正忙的错误提示,需要试多次才能成功。

(3) 重命名表log_new到log。

这样应用程序不用修改(受影响的时间仅几秒钟),日志表就被截断分割了。

上述步骤可以在Oracle里用存储过程来实现。

二、用存储过程来分割表

可以看到在重命名表的方法中,步骤(2)是个关键。下面这个rename_table过程会在有锁阻碍的情况下用递归的方式重试100次。

重命名原始表到目标表的存储过程rename_table:

create or replace procedure rename_table

(source_name in varchar2,

target_name in varchar2,

times in out number)

  is

query_str  varchar2(4000).

source_name1  varchar2(64).

target_name1  varchar2(64).

cursor c1 is 0select segment_name from user_segments 

where segment_name=upper(source_name).

dummy c1%rowtype. 

cursor c2 is 0select segment_name from user_segments

where segment_name=upper(target_name).

dummy2 c2%rowtype. 

begin

source_name1:=source_name.

target_name1:=target_name.

open c1.

fetch  c1  into   dummy.

--   if c1%found then

--   dbms_output.put_line(source_name1||exist!).

--   end if.

open c2.

fetch  c2  into   dummy2.

--   if c2%notfound then

--   dbms_output.put_line(target_name1||not exist!).

--   end if.

if c2%notfound  and c1%found then

query_str :=alter table ||source_name1|| rename to 

||target_name1.

execute immediate query_str.

dbms_output.put_line(rename success!).

end if.

close c1.

close c2.

exception

WHEN OTHERS THEN  

times:=times 1.

if times<100 then

--  dbms_output.put_line(times:||times).

rename_table(source_name1,target_name1,times).

else

dbms_output.put_line(SQLERRM).

dbms_output.put_line(error over 100 times,exit).

end if.

end.

/


相关文章


Oracle诊断案例:Job任务停止执行
Oracle10G在Fedora2上的安装
ORACLE分布式数据库及其应用程序的建立
甲骨文发布快速开发工具APEX2.2版本
如何在Oracle里用存储过程定期分割表
案例学习Oracle错误:ORA-00904
修改ORACLE的DATAFILE文件名
简单说两句Like的优化
Oracle中Instance实例和数据库的区别
澳大利亚华人论坛
考好网
日本华人论坛
华人移民留学论坛
英国华人论坛