2010-11-25 34 views
1

Salut les gars J'essaye d'automatiser un processus de partitionnement ici, et je deviens quelque chose d'étrange. Pourquoi ne pas le travail suivant?Partitions impaires en utilisant last_day

create table flp_aa (cdate date, value varchar2(255)) 
PCTUSED 0 
PCTFREE 10 
INITRANS 1 
MAXTRANS 255 
STORAGE (
      INITIAL   64M 
      ) 
LOGGING 
PARTITION BY RANGE (cdate) 
( 
    PARTITION flp_aa_1010 VALUES LESS THAN (last_day(to_date('20101101', 'YYYYMMDD'))) 
    NOLOGGING 
    NOCOMPRESS 
    PCTFREE 10 
    INITRANS 1 
    MAXTRANS 255 
    STORAGE (
       INITIAL   64M 
       NEXT    512K 
       MINEXTENTS  1 
       MAXEXTENTS  UNLIMITED 
       PCTINCREASE  0 
       BUFFER_POOL  DEFAULT 
       ) 
) 

L'idée est d'utiliser last_day(to_date('20101101', 'YYYYMMDD')) de sorte que chaque partition assez se termine le dernier jour de ce mois et tout le monde est heureux. Cependant, je reçois un ORA-14019 lorsque vous essayez d'exécuter ce code ...

[UPDATE]

Zut étrange:

Ce travail :

(...) 
    PARTITION flp_aa_1010 VALUES LESS THAN (to_date('20101101', 'YYYYMMDD')) 
    (...) 

Cela ne travail:

(...) 
    PARTITION flp_aa_1010 VALUES LESS THAN (last_day(to_date('20101101', 'YYYYMMDD'))) 
    (...) 

Et ce pas encore ne fait:

(...) 
    PPARTITION flp_aa_1010 VALUES LESS THAN to_date(last_day(to_date('201010','YYYYMM')))) 
    (...) 

Qu'est-ce que le canard? quelle classe ai-je manqué ici? La sortie de toutes ces fonctions n'est-elle pas la même?

Quelqu'un pourrait-il m'éclairer?

acclame

f.

Répondre

1

Comme le lien que vous avez posté dit:

élément lié à la partition

doit être une de: string, datetime ou intervalle littéral, numéro ou MAXVALUE

Un appel de fonction (LAST_DAY) n'est pas une chaîne, datetime ou intervalle littéral, nombre ou MAXVALUE. True, TO_DATE est un appel de fonction, mais cela est autorisé comme une exception car traditionnellement, c'était le seul moyen de générer un littéral DATE (vous pouvez maintenant utiliser le format ANSI DATE '2010-11-26' mais peu de gens le savent cette). Voir documentation.

Cependant, au moment où vous créez la valeur « 20101101 », vous pouvez appliquer LAST_DAY et utiliser le résultat au lieu de cela - quelque chose comme:

'... VALUES LESS THAN (' || TO_CHAR (LAST_DAY (...), 'YYYYMMDD') || ')...' 
+0

bien .. pas tout à fait. J'avais déjà essayé ça. Cela ne semble pas être le cas. Vous voyez, le champ 'cdate' est de type date. si vous faites simplement '... VALUES MOINS QUE (to_date ('20101101', 'YYYYMMDD')) ...' ça marche! Pourtant, j'ai aussi essayé de convertir mon cdate en chaîne et d'utiliser le to_char et ça ne marcherait pas en plaçant le truc "last_day" ... bizarre ... – filippo

+0

J'ai mis à jour ma réponse. TO_DATE ('20101101', 'YYYYMMDD') est considéré comme un littéral de date, alors que LAST_DAY (TO_DATE ('20101101', 'YYYYMMDD') ne l'est pas. –

+0

J'ai compris :) merci! – filippo