2017-01-03 9 views
1

私はOracle 11gからの自動パーティショニングを使用していますが、にパーティション名の特定パターンを与えるオプションはありますか?Oracleの自動パーティショニング - パーティションの名前パターン

は、例えば、私が持っている:

create table 
pos_data ( 
    start_date  DATE, 
    store_id   NUMBER, 
    inventory_id  NUMBER(6), 
    qty_sold   NUMBER(3), 
) 
PARTITION BY RANGE (start_date) 
INTERVAL(NUMTOYMINTERVAL(1, 'MONTH')) 
( 
    PARTITION pos_data_init VALUES LESS THAN (TO_DATE('01-01-2017', 'DD-MM-YYYY')), 
    PARTITION pos_data_201702 VALUES LESS THAN (TO_DATE('01-02-2017', 'DD-MM-YYYY')), 
    PARTITION pos_data_201703 VALUES LESS THAN (TO_DATE('01-03-2017', 'DD-MM-YYYY')), 
); 

私は、各月のすべての2017年前の行と、その後のパーティションを持つように初期化パーティションを持つことになります。

自動的に生成される名前付きパーティションの仕組みは? 名前の末尾がYYYYMMとなるパターンを作成する機会はありますか?あるいは後でこれらのパーティションの名前を変更する必要がありますか?

+2

動的SQLでPLSQLを使用してパターンベースの命名規則を保存する – GurV

+0

scirpt-wayしか存在せず、自動的に生成される名前は、part1、part2、part3などの値をバンプするだけですか? – Sarpens

+1

@Sarpens区間分割を使用している場合、データベースによって生成される名前が残っています。 GurVが示唆するように、特定の命名パターンが必要な場合は、パーティションの名前を遡って変更する独自のコードを書く必要があります。 – Boneist

答えて

4

いいえ、動的に作成されたパーティションにパーティション名パターンを指定できるオプションはありません。このような必要が生じた場合には後で名前を変更することができます。個人的に私はそれらの名前を変更する必要はありません。

select * 
    from partitioned_table 
    partition (part_1); 

は、あなたが簡単に知ることが、あなたを必要としない特定のパーティションを、照会するpartition for (<<date>>)句を使用することができます:あなたは、たとえば、クエリでそれらを参照することができますので、それらを自動的に生成パーティションに意味のある名前を与えたい場合クエリを実行するパーティション名:

select * 
    from partitioned_table 
    partition for (date '2017-01-01') 
+1

答えをありがとう!私がここで検討したちょうど古い方法の分割は、特定の名前パターンで作成し、私が自動的に同じ結果を得ることができるかどうか疑問に思っています。新年の願い:) – Sarpens

1

私はスケジューラ・ジョブによって一日に一回実行されたパーティションの名前を変更するには、この手順を使用します。

FUNCTION DailyPartition(tableName IN VARCHAR2) RETURN BOOLEAN IS 

    EXPRESSION_IS_OF_WRONG_TYPE EXCEPTION; 
    PRAGMA EXCEPTION_INIT(EXPRESSION_IS_OF_WRONG_TYPE, -6550); 

    ds INTERVAL DAY TO SECOND; 
    ym INTERVAL YEAR TO MONTH; 
    str VARCHAR2(1000); 

BEGIN  
    SELECT INTERVAL INTO str 
    FROM USER_PART_TABLES 
    WHERE TABLE_NAME = tableName; 

    EXECUTE IMMEDIATE 'BEGIN :ret := '||str||'; END;' USING OUT ym; 
    RETURN FALSE;  
EXCEPTION 
    WHEN EXPRESSION_IS_OF_WRONG_TYPE THEN 
     EXECUTE IMMEDIATE 'BEGIN :ret := '||str||'; END;' USING OUT ds; 
     RETURN TRUE;  
END DailyPartition; 


PROCEDURE RenamePartitions IS 

    ts TIMESTAMP; 
    newName VARCHAR2(30); 

    CURSOR TabPartitions IS 
    SELECT TABLE_NAME, PARTITION_NAME, HIGH_VALUE 
    FROM USER_TAB_PARTITIONS 
    WHERE TABLE_NAME IN ('YOUR_TABLE', ...) 
     AND PARTITION_NAME <> 'P_INITIAL' 
    ORDER BY 1,2; 

BEGIN 

    EXECUTE IMMEDIATE 'ALTER SESSION SET DDL_LOCK_TIMEOUT = 180'; 

    FOR aPart IN TabPartitions LOOP 
     EXECUTE IMMEDIATE 'BEGIN :ret := '||aPart.HIGH_VALUE||'; END;' USING OUT ts; 
     IF DailyPartition(aPart.TABLE_NAME) THEN    
      ts := ts - INTERVAL '1' DAY; 
      newName := 'P_'||TO_CHAR(ts,'yyyy_mm_dd'); 
     ELSE 
      ts := ADD_MONTHS(ts, -1); 
      newName := 'P_'||TO_CHAR(ts,'yyyy_mm'); 
     END IF; 
     IF aPart.PARTITION_NAME <> newName THEN    
      EXECUTE IMMEDIATE 'ALTER TABLE '||aPart.TABLE_NAME||' RENAME PARTITION '||aPart.PARTITION_NAME||' TO '||newName; 
     END IF; 
    END LOOP; 

END RenamePartitions; 
関連する問題