2016-03-31 8 views
2

ORACLEのテーブルを24個のパーティションで作成する必要があります。現在の時間から始まる1日のうちの1時間に1つずつです。 次のスクリプトは、DBAが実行する日時によって異なります。 現在の時刻と日付を考慮してテーブルとパーティションを作成する動的スクリプトを提供するにはどうすればよいですか?テーブルといくつかの初期パーティションを動的に作成する方法はありますか?

DROP TABLE TABLE_NAME CASCADE CONSTRAINTS; 
CREATE TABLE TABLE_NAME 
(
    CODE1    NUMBER(9)   DEFAULT (0), 
    CODE2    NUMBER(9)   DEFAULT (0), 
    CODE3    VARCHAR2(50 BYTE) DEFAULT (' '), 
    VELOCITY   NUMBER(10,3)  DEFAULT (0), 
    REALDATE   TIMESTAMP(6), 
    LOCATION   NUMBER(7,3)   DEFAULT (0), 
    VALIDLOCATION  NUMBER(1)   DEFAULT (0), 
    STARTTIME   NUMBER(9)   DEFAULT (0), 
    OUTBOUND   NUMBER(1)   DEFAULT (0), 
    SERVICE_NAME  VARCHAR2(20 BYTE) DEFAULT (' '), 
    LOCATIONCODE  NUMBER(3)   DEFAULT 0, 
    STARTDATE   TIMESTAMP(6), 
    CODE4    VARCHAR2(1 BYTE) 
) 
NOCOMPRESS 
TABLESPACE TABLESPACE_NAME 
PCTUSED 40 
PCTFREE 10 
INITRANS 1 
MAXTRANS 255 
STORAGE (
      BUFFER_POOL  DEFAULT 
      ) 
PARTITION BY RANGE (REALDATE) 
( 
    PARTITION TABLE_NAME_2016031612 VALUES LESS THAN (TIMESTAMP' 2016-03-16 13:00:00'), 
    PARTITION TABLE_NAME_2016031613 VALUES LESS THAN (TIMESTAMP' 2016-03-16 14:00:00'), 
    PARTITION TABLE_NAME_2016031614 VALUES LESS THAN (TIMESTAMP' 2016-03-16 15:00:00'), 
    PARTITION TABLE_NAME_2016031615 VALUES LESS THAN (TIMESTAMP' 2016-03-16 16:00:00'), 
    PARTITION TABLE_NAME_2016031616 VALUES LESS THAN (TIMESTAMP' 2016-03-16 17:00:00'), 
    PARTITION TABLE_NAME_2016031617 VALUES LESS THAN (TIMESTAMP' 2016-03-16 18:00:00'), 
    PARTITION TABLE_NAME_2016031618 VALUES LESS THAN (TIMESTAMP' 2016-03-16 19:00:00'), 
    PARTITION TABLE_NAME_2016031619 VALUES LESS THAN (TIMESTAMP' 2016-03-16 20:00:00'), 
    PARTITION TABLE_NAME_2016031620 VALUES LESS THAN (TIMESTAMP' 2016-03-16 21:00:00'), 
    PARTITION TABLE_NAME_2016031621 VALUES LESS THAN (TIMESTAMP' 2016-03-16 22:00:00'), 
    PARTITION TABLE_NAME_2016031622 VALUES LESS THAN (TIMESTAMP' 2016-03-16 23:00:00'), 
    PARTITION TABLE_NAME_2016031623 VALUES LESS THAN (TIMESTAMP' 2016-03-17 00:00:00'), 
    PARTITION TABLE_NAME_2016031700 VALUES LESS THAN (TIMESTAMP' 2016-03-17 01:00:00'), 
    PARTITION TABLE_NAME_2016031701 VALUES LESS THAN (TIMESTAMP' 2016-03-17 02:00:00'), 
    PARTITION TABLE_NAME_2016031702 VALUES LESS THAN (TIMESTAMP' 2016-03-17 03:00:00'), 
    PARTITION TABLE_NAME_2016031703 VALUES LESS THAN (TIMESTAMP' 2016-03-17 04:00:00'), 
    PARTITION TABLE_NAME_2016031704 VALUES LESS THAN (TIMESTAMP' 2016-03-17 05:00:00'), 
    PARTITION TABLE_NAME_2016031705 VALUES LESS THAN (TIMESTAMP' 2016-03-17 06:00:00'), 
    PARTITION TABLE_NAME_2016031706 VALUES LESS THAN (TIMESTAMP' 2016-03-17 07:00:00'), 
    PARTITION TABLE_NAME_2016031707 VALUES LESS THAN (TIMESTAMP' 2016-03-17 08:00:00'), 
    PARTITION TABLE_NAME_2016031708 VALUES LESS THAN (TIMESTAMP' 2016-03-17 09:00:00'), 
    PARTITION TABLE_NAME_2016031709 VALUES LESS THAN (TIMESTAMP' 2016-03-17 10:00:00'), 
    PARTITION TABLE_NAME_2016031710 VALUES LESS THAN (TIMESTAMP' 2016-03-17 11:00:00'), 
    PARTITION TABLE_NAME_2016031711 VALUES LESS THAN (TIMESTAMP' 2016-03-17 12:00:00') 
) 
NOCACHE 
NOPARALLEL 
MONITORING; 
+2

あなたが毎日のテーブル/パーティションを作成する必要がある場合、あなたは再検討する必要がありますあなたのデザイン。 – OldProgrammer

+1

なぜINTERVALパーティションを使用していませんか? –

+0

@WernfriedDomscheitは本当に理由を知らないのです...いいアプローチです...私は、非常に大きなテーブルからトリガーで作成されている小さなテーブルであるため、ちょうどいくつかのパーティションを保持したいからです。 – Rodrick

答えて

4

あなたは、SYSDATEに基づいてSQLステートメントを構築することにより、いくつかの動的SQLを試すことができます。

declare 
    vSQL   varchar2(32767); 
    vPartitions  varchar2(32767); 
begin 
    select listagg('PARTITION TABLE_NAME_' || to_char(sysdate + level/24, 'yyyymmddhh24') || 
        ' VALUES LESS THAN (TIMESTAMP''' || to_char(sysdate + (level+1)/24, 'yyyy-mm-dd hh24') || ':00:00'')' 
        , ', ') within group (order by level) 
    into vPartitions 
    from dual 
    connect by level <= 24; 
    -- 
    vSQL := q'[ CREATE TABLE TABLE_NAME 
       (
        CODE1    NUMBER(9)   DEFAULT (0), 
        CODE2    NUMBER(9)   DEFAULT (0), 
        CODE3    VARCHAR2(50 BYTE) DEFAULT (' '), 
        VELOCITY   NUMBER(10,3)  DEFAULT (0), 
        REALDATE   TIMESTAMP(6), 
        LOCATION   NUMBER(7,3)   DEFAULT (0), 
        VALIDLOCATION  NUMBER(1)   DEFAULT (0), 
        STARTTIME   NUMBER(9)   DEFAULT (0), 
        OUTBOUND   NUMBER(1)   DEFAULT (0), 
        SERVICE_NAME  VARCHAR2(20 BYTE) DEFAULT (' '), 
        LOCATIONCODE  NUMBER(3)   DEFAULT 0, 
        STARTDATE   TIMESTAMP(6), 
        CODE4    VARCHAR2(1 BYTE) 
       ) 
       NOCOMPRESS 
       TABLESPACE TABLESPACE_NAME 
       PCTUSED 40 
       PCTFREE 10 
       INITRANS 1 
       MAXTRANS 255 
       STORAGE (
          BUFFER_POOL  DEFAULT 
          ) 
       PARTITION BY RANGE (REALDATE) 
       (]' || vPartitions || 
       ') 
       NOCACHE 
       NOPARALLEL 
       MONITORING';  
    execute immediate 'DROP TABLE TABLE_NAME CASCADE CONSTRAINTS'; 
    execute immediate vSQL; 
end; 
+0

"vSQL:= q"の "q"とは何ですか? "無効なSQL文" この - ラインで45 00900. 00000: ORA-00900:無効なSQL文 ORA-06512 "Q" との二重引用符DEFAULTを( '')私は取得しています取り出した後、すぐにvSQLを実行してください。 – Rodrick

+0

q演算子は、文字列の二重引用符を避けるために使用されます(例:[here](http://www.oracle-developer.net/display.php?id=311)を参照してください)。しかし、私の答えにエラーがあった、固定 – Aleksej

+0

ありがとう! :) – Rodrick

関連する問題