oracle - 有没有办法动态创建表和一些初始分区?

标签 oracle

我需要在 ORACLE 上创建一个具有 24 个分区的表,从当前时间开始,一天中的每一个小时都有一个分区。 因此,以下脚本将取决于 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;

最佳答案

您可以尝试使用一些动态 SQL,通过基于 sysdate 构建 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;

关于oracle - 有没有办法动态创建表和一些初始分区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36333422/

相关文章:

oracle - 无法在Oracle匿名 block 中调用和执行.sql脚本文件

sql - Oracle 窗口函数求和

sql - SQL查询的问题

oracle - Hibernate 索引查询慢

oracle - PLS-00302 : component 'SLEEP' must be declared

.net - 找不到 Oracle OpenSSO Fedlet .NET 主文件夹

javascript - 是否可以阻止 oracle apex 提交页面,直到用户单击该页面上的刷新按钮?

database - 业务逻辑 : Database or Application Layer

database - 甲骨文是否面临千年虫问题?

oracle - SSH隧道连接到Oracle数据库