2012-08-27

how to automatically create partitions on a table


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

    }
}

Niciun comentariu:

Trimiteți un comentariu