您的位置:首页 > 其它

【20150622】自动按日期分区的分区表建立

2015-06-22 11:28 218 查看
建立分区表及自动分区写入实例

目的:建立一个表,其表中内容按日期进行分区管理,每次写入时,如果不存在该分区,则新建分区,否则将分区内容删除后重新写入对应日期的内容。

分区内容参考:/article/5044840.html

主要的分区方法有

1、 范围分区,方式为partitionby range(column_name)(…)

2、 列表分区,方式为partitionby list(column_name)(…)

3、 Hash分区,方式为partition by hash(column_name)(…)

4、 组合分区,即以上分区方式的组合

由于该表要求每日的内容分别放入分区中,故选择列表分区即可(类似的,按月份分区可以使用to_date(data,’yyyy-mm’)进行处理)。

而hash分区适合无合适的分区字段值的表使用。

建表过程如下:

create table F_JK_JXKH_CKZHFTP

(

SYS_BIZ_DATE VARCHAR2(8),

ac_id VARCHAR2(80),

ac_seq VARCHAR2(120),

…. )

tablespace TEST_DATA –指定表空间

partition by list(SYS_BIZ_DATE)—指分区用字段

(partition P_20150413 values ('20150413'),--字段分配空间名

partition P_20150401 values ('20150401') );

在使用存储过程进行数据存入前,需要进行判断分区是否存在,相关语句如下:

/*使用历史表,增量处理,同一天记录覆盖处理*/

/*条件判断*/

v_partition := 'P_'||v_work_date;

select count(*) into v_if

from (select table_name,partition_name

from user_tab_partitions

where table_name='F_JK_JXKH_DKZHFTP'

and partition_name=v_partition);

ifv_if<>0

then

v_sql:='alter table F_JK_JXKH_DKZHFTP truncatepartition('||v_partition||')';

EXECUTE IMMEDIATE v_sql;

else

v_sql:='alter table F_JK_JXKH_DKZHFTP '||

'add partition '||v_partition||' values('||v_work_date||')';

EXECUTE IMMEDIATE v_sql; --execute+ 字符串,执行字符串中的语句,注意此处变量的使用方式。

end if;

其中,分区增加语句为alter table F_JK_JXKH_DKZHFTP truncate partition(v_partition)

对分区进行数据删除时使用

alter table F_JK_JXKH_DKZHFTP truncatepartition(v_partition);

在此处,对系统视图user_tab_partition进行检视,判定分区是否存在。不存在则按照命名规则建立新表,否则对表执行truncate操作。

值得注意的是,在导入数据时,将日期也设定为条件进行导入(即使源表从设计上应该只保存需要日期的数据),以免出现日期输入错误时,使其他日期的数据重复和出现的情况。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: