2017-07-12 39 views
0

我有一张巨大的表,它包含大量数据 - 历史记录和当前数据。varchar2列上的区间分区

我有一些表旧数据移动到历史表

自动工作(并从源中删除)。

所以我想建立一个

interval-partition

表,从该表中获取旧数据。

的问题是,在源基日期列是VARCHAR2在这种模式:

2017/07

和数据类型需要是相同的源的新的表列。

所以当我试图创建间隔分区表时,我无法对它做一个范围。

如果您尝试使用

to_date

你得到一个错误。

我该怎么做?

这是源表:

CREATE TABLE 
DATA_01( 
APPLICATION VARCHAR2(10 BYTE), 
PROCESS  VARCHAR2(100 BYTE), 
SNAPSHOT_MONTH VARCHAR2(7 BYTE) 
); 

这就是我想做的事,但得到的错误:

CREATE TABLE 
HISTORY_01 ( 
    APPLICATION VARCHAR2(10 BYTE) NOT NULL ENABLE, 
    PROCESS  VARCHAR2(100 BYTE), 
    SNAPSHOT_MONTH VARCHAR2(7 BYTE) 
) 
PARTITION BY RANGE (to_date(snapshot_month, 'yyyy/mm')) 
INTERVAL(NUMTOYMINTERVAL(1, 'MONTH')) 
( 
    PARTITION p_until_01_1900 VALUES LESS THAN (TO_DATE('01-01-1900', 'DD-MM-YYYY')) 
); 

感谢。

+0

尝试:'PARTITION BY RANGE(TO_DATE(snapshot_month || '/ 01', 'YYYY/MM/DD')) INTERVAL( NUMTOYMINTERVAL(1,'MONTH')) ( PARTITION p_until_01_1900 VALUE THAN(TO_DATE('1900/01/01','yyyy/mm/dd')) ); ' – g00dy

+0

您无法将to_date插入范围列..这会引发错误。 – user2671057

+0

检查此链接http://www.dba-oracle.com/t_partitioning_tables.htm - g00dy

回答

1

定义虚拟列,并使用此用于划分:

CREATE TABLE 
HISTORY_01 ( 
    APPLICATION VARCHAR2(10 BYTE) NOT NULL ENABLE, 
    PROCESS  VARCHAR2(100 BYTE), 
    SNAPSHOT_MONTH VARCHAR2(7 BYTE), 
    PARTITION_KEY TIMESTAMP GENERATED ALWAYS AS (TO_TIMESTAMP(snapshot_month, 'yyyy/mm')) VIRTUAL 
) 
PARTITION BY RANGE (PARTITION_KEY) 
INTERVAL(NUMTOYMINTERVAL(1, 'MONTH')) 
( 
    PARTITION p_until_01_1900 VALUES LESS THAN (TIMESTAMP '1900-01-01 00:00:00') 
); 
+0

我可以做到这一点,但插入数据的脚本是dynamiclly工作,所以它执行即时'insert into history_01 select * from data_01'..这就是为什么我想要的结构是相同的。我可以改变脚本来插入执行立即只有非虚拟的列...但我想要别的东西,如果存在的话。 – user2671057

+0

为它创建一个视图:CREATE TABLE T_HISTORY_01(...; CREATE VIEW HISTORY_01 AS SELECT APPLICATION,PROCESS,SNAPSHOT_MONTH FROM T_HISTORY_01;' –