the following java program will help you to build the syntax for creating monthly partitions
package creare_automat_partitii_oracle;
/**
*
* @author
*
* rezultatul trebuie sa fie ceva de genul
* ...
* PARTITION P2012_11 VALUES LESS THAN (TO_DATE('01/12/2012', 'DD/MM/YYYY')) TABLESPACE EVAT04,
* PARTITION P2012_12 VALUES LESS THAN (TO_DATE('01/01/2013', 'DD/MM/YYYY')) TABLESPACE EVAT04,
* PARTITION P2013_12 VALUES LESS THAN (TO_DATE('01/01/2014', 'DD/MM/YYYY')) TABLESPACE EVAT04,
* PARTITION PDEFAULT VALUES LESS THAN (MAXVALUE) TABLESPACE EVAT04 )
*
* Pentru indecsi, trebuie sa apara ceva de genul
* CREATE INDEX invoices_idx ON invoices (invoice_date) LOCAL
* (PARTITION invoices_q1 TABLESPACE users,
* PARTITION invoices_q2 TABLESPACE users,
* PARTITION invoices_q3 TABLESPACE users,
* PARTITION invoices_q4 TABLESPACE users);
*/
public class Creare_automat_partitii_oracle {
static int iAn_start = 2004;
static int iAn_final = 2014;
static String sTablespace = "USERS"; // radacina cuvantului din numele tbs-urilor unde vor fi partitiile pe ani
static String sCriteriu_partitionare = "create table .... (col1,col2...) PARTITION BY RANGE (RUN_DATE)";
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
partitionare_dupa_luna();
}
public static void partitionare_dupa_luna() {
StringBuilder sScript_index = new StringBuilder("create index ... on ....(...) LOCAL " + "(") ;
System.out.println(sCriteriu_partitionare);
System.out.println("(");
for (int i_an = iAn_start; i_an <= iAn_final; i_an++) {
for (int luna = 1; luna <= 12; luna++) {
String sNume_partitie;
StringBuilder sb = new StringBuilder();
int iAn_urmator_la_range;
String sLimita_superioara;
//construiesc un string de tipul P2012_01
sb.append("P");
sb.append(i_an);
sb.append("_");
sb.append(String.format("%02d", luna)); //pt a formata corect la 2 zecimale luna .... P2012_01..P2012_02...P2012_12
sNume_partitie = sb.toString();
// treb sa afisez ceva de genul TO_DATE('01/02/2012', 'DD/MM/YYYY')
String sLuna_urmatoare_la_range;
//daca sunt in ultima luna a anului, atunci limita sup a partitiei e prima luna din anul urmator
if (luna == 12) {
sLuna_urmatoare_la_range = "01";
iAn_urmator_la_range = i_an + 1; //i_an creste cu 1 , pentru ca e ultima luna din an iar limita sup e 01.01.anulurmator
} else {
sLuna_urmatoare_la_range = "" + String.format("%02d", luna + 1); // limita lunii creste cu o unitate
iAn_urmator_la_range = i_an; //anul ramane neschimbat
}
sLimita_superioara = new String("(TO_DATE(\'01/" + sLuna_urmatoare_la_range + "/" + iAn_urmator_la_range + "\', \'DD/MM/YYYY\'))");
//System.out.println(sNume_partitie + " --> " + sLimita_superioara);
//numele tablespace-ului va contine si anul din care e partitia --> variabila i_an din primul for
System.out.println(" PARTITION " + sNume_partitie + " VALUES LESS THAN " + sLimita_superioara + " TABLESPACE " + sTablespace.concat("_" + i_an ) + " ,");
//construiesc si scriptul pentru partitionarea indecsilor
sScript_index.append("\n" + "PARTITION " + sNume_partitie + " TABLESPACE " + sTablespace.concat("_" + i_an ) + " ," );
}
}
System.out.println(" PARTITION PDEFAULT VALUES LESS THAN (MAXVALUE) TABLESPACE " + sTablespace);
sScript_index.append("\n" + " PARTITION DEFAULT TABLESPACE " + sTablespace + " ); ");
System.out.println(");");
System.out.println("");
System.out.println("Scriptul pentru partitionarea indexului ");
System.out.println(sScript_index);
}
}