【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操作。
值得注意的是,在导入数据时,将日期也设定为条件进行导入(即使源表从设计上应该只保存需要日期的数据),以免出现日期输入错误时,使其他日期的数据重复和出现的情况。
目的:建立一个表,其表中内容按日期进行分区管理,每次写入时,如果不存在该分区,则新建分区,否则将分区内容删除后重新写入对应日期的内容。
分区内容参考:/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操作。
值得注意的是,在导入数据时,将日期也设定为条件进行导入(即使源表从设计上应该只保存需要日期的数据),以免出现日期输入错误时,使其他日期的数据重复和出现的情况。
相关文章推荐
- AVR单片机学习笔记
- Error evaluating ORM mappings block for domain
- Android动态加载框架DL的架构与基本原理解析
- 何为 ISAPI
- 消息队列实现接收发送的例子
- getchar()
- 计算机硬件
- Hadoop2.2.0已经遗弃的属性名称
- grails,groovy无限树递归
- Java--Reflect(反射)专题6——通过反射了解集合泛型的本质
- maya2nuke 传递模型和贴图的关系
- JavaWeb网上商城的反思
- 几本自然语言处理入门书
- php读取der格式证书乱码解决方法
- 万物皆可“互联网+”
- BZOJ3173 [Tjoi2013]最长上升子序列(离线处理+Treap+LIS)
- KT学算法(二)——循环有序数组查找指定元素
- C实现 LeetCode->Reverse Nodes in k-Group (双指针大法)(单链表反转)
- [转]一个简单的生成随机手机/电话号码/身份证号/银行卡号/地址/电子邮件等的Oracle小程序
- .sql文件的使用