使用kettle交换工具自动创建oracle表分区。有很多朋友都用不同的交换工具,但大多数功能还是一致的。这里我使用的kettle是我们公司自己的。
1.先在oracle数据库里创建一个分区表实例,这里我按日分区:
create table DE_TEST(
name_tag varchar2(10),
day_tag DATE
)
PARTITION BY RANGE (day_tag)
(
PARTITION DE_TEST_20170405 VALUES LESS THAN (TO_DATE('2017-04-0600:00:00','yyyy-mm-ddhh24:mi:ss')),
PARTITION DE_TEST_20170406 VALUES LESS THAN (TO_DATE('2017-04-0700:00:00','yyyy-mm-ddhh24:mi:ss'))
)
在正式操作之前,先分析一下需求:如果我们需要自动创建表分区,就需要查询该表的最大分区,来判断是否需要创建新分区,日常创建分区要满足的条件是至少建立到当天日期分区的第二天。
2.我的大体思路: 获取最大分区-->将最大分区值日期与当天的日期做比较
比较的三种情况及结果如下:
如果相等,就表明最大分区正好建立到了当天日期,这种情况只需要提前建好明天(即当天系统日期的第二天)的日期分区如果最大分区值小于当天的日期值 ,就循环创建新分区 ,直到创建好当天系统日期的第二天日期分区为止如果最大分区值已经大于当天的日期值,就表明不需要创建新分区
3.具体步骤:
一、先建立交换:
(获取最大分区:通过查询最大分区 ,改写SQL得到三个字段:比较天数,分区时间(需要新建的分区名称),结束时间):
具体SQL如下
select
to_date(to_char(sysdate,'yyyymmdd'),'yyyymmdd')-to_date(substr(u.partition_name,9),'yyyymmdd') bjts
,'DE_TEST_'||to_char(to_date(substr(u.partition_name,9),'yyyymmdd')+1,'yyyymmdd')fqsj
,to_char(to_date(substr(u.partition_name,9),'yyyymmdd')+2,'yyyy-mm-ddhh24:mi:ss') jssj
from user_tab_partitions u
where u.table_name='DE_TEST'
orderbyPARTITION_NAMEdesc
通过以上SQL预览数据如下:
BJTS(很重要,需理解)就是说系统当前时间-最大分区的时间所差的天数,如果=0,说明最大分区就是当天的,需要建好明天的一个分区;如果>0,就说明最大分区至少在当前系统时间的前一天乃至前N天,所以需要新建至少两个新的分区;如果<0,就说明满足条件,不需要新建分区
(bjts和BJTS大小写无所谓,都一样哈)
(设置变量):
将这三个获得的字段 设置成环境变量供作业中调用
二、创建作业,来调度交换
(1)在作业中调度上面步骤创建的交换,然后把下一步连接到检验字段的值
(2)如何检验字段的值:
注意:调用变量,变量名需要外加 ${}
这里调用的变量就是交换中提到的bjts(比较天数,bjts只是我起的一个变量名,拼音比较容易理解),之前分析过。这里不再多加赘述。
成功条件,如果值bjts小于0,就是说不用创建新分区了,直接提示作业成功即可
如果不符合这个条件,就往下面走,去进行创建新分区步骤
(3)创建新分区
altertable DE_TEST
add partition ${fqsj}
values less than (TO_DATE(${jssj}))
注意: ${}用来调用之前的变量
如果再检验字段的值,还不满足条件,就继续循环,直到满足条件为止,就成功
这是今天刚做的实例,纯原创,当作是学习的记录。
就爱阅读www.92to.com网友整理上传,为您提供最全的知识大全,期待您的分享,转载请注明出处。
来源: http://www.92to.com/bangong/2017/04-08/20138453.html