2017-07-12 36 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;' –