Skip to Main Content

SQL & PL/SQL

Announcement

For appeals, questions and feedback about Oracle Forums, please email oracle-forums-moderators_us@oracle.com. Technical questions should be asked in the appropriate category. Thank you!

Partition issue

Greg SpallMay 23 2013 — edited May 29 2013
Hey everyone, mucking on an Oracle 11.2 database, simple range partitioning issue. Seems using a "complex" formula inside the AT clause annoys it? Or am I doing something wrong?

I create the table with RANGE partition just fine:
CREATE TABLE my_part_tab
   ( id        number,
     sdate     date
     )
 PARTITION BY RANGE ( sdate )
      (  PARTITION P2013Q1 VALUES LESS THAN ( TO_DATE('01-jan-2013','dd-mon-yyyy') ),
         PARTITION P2013Q2 VALUES LESS THAN ( TO_DATE('01-jul-2013','dd-mon-yyyy') ),
         PARTITION P2013Q3 VALUES LESS THAN ( TO_DATE('01-oct-2013','dd-mon-yyyy') ),
         PARTITION P2013Q4 VALUES LESS THAN ( TO_DATE('01-jan-2014','dd-mon-yyyy') ),
         PARTITION P2014Q1 VALUES LESS THAN ( TO_DATE('01-apr-2014','dd-mon-yyyy') ),
         PARTITION P2014Q2 VALUES LESS THAN ( TO_DATE('01-jul-2014','dd-mon-yyyy') ),
         PARTITION P2014Q3 VALUES LESS THAN ( TO_DATE('01-oct-2014','dd-mon-yyyy') ),
         PARTITION P2014Q4 VALUES LESS THAN ( TO_DATE('01-jan-2015','dd-mon-yyyy') ),
         PARTITION PMAX    VALUES LESS THAN ( MAXVALUE )
      );
      
Table created.
(and yes, I'm aware of INTERVAL option that'll do this next part "automagically", however, INTERVAL and REFERENCE partitioning are incompatible, and the child table is using REFERENCE partition).

So anyway, to make things easier on DBA for future, I'm trying to create a script that makes added a year's worth of partitions less manual.

So far, I have the following working:
ACCEPT lYear PROMPT "Add Paritions for which calendar year?"

ALTER TABLE my_part_tab SPLIT PARTITION PMAX
   AT ( TO_DATE('01-apr-&lYear','dd-mon-yyyy') ) INTO ( PARTITION P&lYear.Q1,PARTITION PMAX );
ALTER TABLE my_part_tab SPLIT PARTITION PMAX
   AT ( TO_DATE('01-jul-&lYear','dd-mon-yyyy') ) INTO ( PARTITION P&lYear.Q2,PARTITION PMAX );
ALTER TABLE my_part_tab SPLIT PARTITION PMAX
   AT ( TO_DATE('01-oct-&lYear','dd-mon-yyyy') ) INTO ( PARTITION P&lYear.Q3,PARTITION PMAX );
ALTER TABLE my_part_tab SPLIT PARTITION PMAX
   AT ( (TO_DATE('31-dec-&lYear','dd-mon-yyyy')) ) INTO ( PARTITION P&lYear.Q4,PARTITION PMAX );

SQL >  ACCEPT lYear PROMPT "Add Paritions for which calendar year?"
Add Paritions for which calendar year?2015
SQL >  
SQL >  ALTER TABLE my_part_tab SPLIT PARTITION PMAX
  2     AT ( TO_DATE('01-apr-&lYear','dd-mon-yyyy') ) INTO ( PARTITION P&lYear.Q1,PARTITION PMAX );
old   2:    AT ( TO_DATE('01-apr-&lYear','dd-mon-yyyy') ) INTO ( PARTITION P&lYear.Q1,PARTITION PMAX )
new   2:    AT ( TO_DATE('01-apr-2015','dd-mon-yyyy') ) INTO ( PARTITION P2015Q1,PARTITION PMAX )

Table altered.

SQL >  ALTER TABLE my_part_tab SPLIT PARTITION PMAX
  2     AT ( TO_DATE('01-jul-&lYear','dd-mon-yyyy') ) INTO ( PARTITION P&lYear.Q2,PARTITION PMAX );
old   2:    AT ( TO_DATE('01-jul-&lYear','dd-mon-yyyy') ) INTO ( PARTITION P&lYear.Q2,PARTITION PMAX )
new   2:    AT ( TO_DATE('01-jul-2015','dd-mon-yyyy') ) INTO ( PARTITION P2015Q2,PARTITION PMAX )

Table altered.

SQL >  ALTER TABLE my_part_tab SPLIT PARTITION PMAX
  2     AT ( TO_DATE('01-oct-&lYear','dd-mon-yyyy') ) INTO ( PARTITION P&lYear.Q3,PARTITION PMAX );
old   2:    AT ( TO_DATE('01-oct-&lYear','dd-mon-yyyy') ) INTO ( PARTITION P&lYear.Q3,PARTITION PMAX )
new   2:    AT ( TO_DATE('01-oct-2015','dd-mon-yyyy') ) INTO ( PARTITION P2015Q3,PARTITION PMAX )

Table altered.

SQL >  ALTER TABLE my_part_tab SPLIT PARTITION PMAX
  2     AT ( (TO_DATE('31-dec-&lYear','dd-mon-yyyy')) ) INTO ( PARTITION P&lYear.Q4,PARTITION PMAX );
old   2:    AT ( (TO_DATE('31-dec-&lYear','dd-mon-yyyy')) ) INTO ( PARTITION P&lYear.Q4,PARTITION PMAX )
new   2:    AT ( (TO_DATE('31-dec-2015','dd-mon-yyyy')) ) INTO ( PARTITION P2015Q4,PARTITION PMAX )

Table altered.
If you look at that final, partition, however, I set the AT clause to Dec 31, 2015. It should be Jan 1, 2016.
Any thoughts on how to pull that off?

I tried the following:
ALTER TABLE my_part_tab SPLIT PARTITION PMAX
   AT ( (TO_DATE('31-dec-&lYear','dd-mon-yyyy')+1) ) INTO ( PARTITION P&lYear.Q4,PARTITION PMAX );

SQL >  ACCEPT lYear PROMPT "Add Paritions for which calendar year?"
Add Paritions for which calendar year?2016
SQL >  ALTER TABLE my_part_tab SPLIT PARTITION PMAX
  2     AT ( (TO_DATE('31-dec-&lYear','dd-mon-yyyy')+1) ) INTO ( PARTITION P&lYear.Q4,PARTITION PMAX );
old   2:    AT ( (TO_DATE('31-dec-&lYear','dd-mon-yyyy')+1) ) INTO ( PARTITION P&lYear.Q4,PARTITION PMAX )
new   2:    AT ( (TO_DATE('31-dec-2016','dd-mon-yyyy')+1) ) INTO ( PARTITION P2016Q4,PARTITION PMAX )
   AT ( (TO_DATE('31-dec-2016','dd-mon-yyyy')+1) ) INTO ( PARTITION P2016Q4,PARTITION PMAX )
                                                 *
ERROR at line 2:
ORA-14019: partition bound element must be one of: string, datetime or interval literal, number, or MAXVALUE
(yes, this time I passed it 2016, because the 2015 partitions are there now ... I did confirm it by removing the final Q4 partition in the previous trial and tried this one with 2015 year, same thing).

But no luck ...
Same issue with other variations:
ALTER TABLE my_part_tab SPLIT PARTITION PMAX
   AT ( (ADD_MONTHS(TO_DATE('01-jan-&lYear','dd-mon-yyyy'),12)) ) INTO ( PARTITION P&lYear.Q4,PARTITION PMAX );

ALTER TABLE my_part_tab SPLIT PARTITION PMAX
   AT ( (TO_DATE('01-jan-'||TO_CHAR(TO_NUMBER('&lYear')+1,'fm9999'),'dd-mon-yyyy')) ) INTO ( PARTITION P&lYear.Q4,PARTITION PMAX );
Anyone have any ideas?
This post has been answered by gaverill on May 23 2013
Jump to Answer
Comments
Locked Post
New comments cannot be posted to this locked post.
Post Details
Locked on Jun 26 2013
Added on May 23 2013
11 comments
386 views