2017-07-12 3 views
0

J'ai une énorme table qui contient beaucoup de données - l'historique et le courant.Partition d'intervalle sur la colonne varchar2

J'ai un travail automatique qui se déplacent d'anciennes données de quelques tables aux tables historiques

(puis supprimer de la source).

Je veux construire une table

interval-partition

qui obtenir les anciennes données de ce tableau.

Le problème est que la base date colonne dans la source est varchar2 dans ce modèle:

2017/07

Et les nouvelles colonnes de table doivent être des types de données identiques à la source. Donc quand j'essaye de créer la table de partitionnement d'intervalle, je ne peux pas faire une gamme dessus.

vous obtenez une erreur si vous essayez d'utiliser

to_date

.

Comment puis-je faire ça ???

C'est la table source:

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

que ce que je voulais faire, mais faire erreur:

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')) 
); 

Merci.

+0

essayer: 'PARTITION DE GAMME (to_date (snapshot_month || '/ 01', 'aaaa/mm/jj)) INTERVALLE (NUMTOYMINTERVAL (1, 'MOIS')) ( PARTITION p_until_01_1900 VALEURS MOINS QUE (TO_DATE ('1900/01/01', 'aaaa/mm/jj')) ); ' – g00dy

+0

Vous ne pouvez pas insérer to_date dans la colonne plage ... cela provoque une erreur. – user2671057

+0

Vérifiez ce lien http://www.dba-oracle.com/t_partitioning_tables.htm - g00dy

Répondre

1

Définir une colonne virtuelle et l'utiliser pour le partitionnement:

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

Je peux le faire mais le script qui insère les données fonctionne de manière dynamique, donc il exécute l'exécution immédiate 'insert into history_01 select * from data_01' .. c'est pourquoi je veux que la structure soit la même. Je peux changer le script pour insérer l'exécution immédiate seulement les colonnes qui ne sont pas virtuelles ... mais je veux quelque chose d'autre s'il existe .. – user2671057

+0

Créer une vue pour cela: 'CREATE TABLE T_HISTORY_01 (...; CREATE VIEW HISTORY_01 AS SELECT APPLICATION, PROCESSUS, SNAPSHOT_MONTH FROM T_HISTORY_01; ' –