Oracle Partition by 2列Interval

时间:2015-02-06 08:12:35

标签: oracle database-partitioning

我试图在谷歌上找到我的情况,但没有人谈论这种情况。

我有一张桌子,可以用2列分区。 对于2列分区,任何人都可以显示间隔的示例吗?

在这种情况下,我只有一个。 对于此示例,我如何使用具有2列的间隔

 INTERVAL( NUMTODSINTERVAL(1,'DAY'))

我的表:

create table TABLE_TEST
(
PROCESS_DATE DATE GENERATED ALWAYS AS (TO_DATE(SUBSTR("CHARGE_DATE_TIME",1,10),'yyyymmdd')),
PROCESS_HOUR VARCHAR(10) GENERATED ALWAYS AS     (SUBSTR("CHARGE_DATE_TIME",12,2)),
ANUM varchar(100),
SWTICH_DATE_TIME varchar(100), 
CHARGE_DATE_TIME varchar(100),
CHARGE varchar(100),
)
TABLESPACE TB_LARGE_TAB
PARTITION BY RANGE (PROCESS_DATE, PROCESS_HOUR)
INTERVAL( NUMTODSINTERVAL(1,'DAY'))

非常感谢, Macieira

2 个答案:

答案 0 :(得分:2)

如果您的范围有多个列,则无法使用间隔;你得到:ORA-14750:带有INTERVAL子句的范围分区表有多个列。 From the documentaion

  

您只能指定一个分区键列,它必须是NUMBER,DATE,FLOAT或TIMESTAMP数据类型。

我不确定您为什么要将日期和小时拆分为单独的列(因为日期还有时间组件),或者为什么要存储' real& #39;日期和数字值作为字符串;首先只有具有正确数据类型的列会更简单。但假设您已设置以这种方式存储数据并且需要单独的process_dateprocess_hour列,则可以添加第三个组合它们的虚拟列:

create table TABLE_TEST
(
  PROCESS_DATE DATE GENERATED ALWAYS AS (TO_DATE(SUBSTR(CHARGE_DATE_TIME,1,10),'YYYYMMDD')),
  PROCESS_HOUR VARCHAR2(8) GENERATED ALWAYS AS (SUBSTR(CHARGE_DATE_TIME,12,2)),
  PROCESS_DATE_HOUR DATE GENERATED ALWAYS AS (TO_DATE(CHARGE_DATE_TIME, 'YYYYMMDDHH24')),
  ANUM VARCHAR2(100),
  SWTICH_DATE_TIME VARCHAR2(100), 
  CHARGE_DATE_TIME VARCHAR2(100),
  CHARGE VARCHAR2(100)
)
PARTITION BY RANGE (PROCESS_DATE_HOUR)
INTERVAL (NUMTODSINTERVAL(1,'DAY'))
(
  PARTITION TEST_PART_0 VALUES LESS THAN (DATE '1970-01-01')
);

Table table_test created.

我还将您的字符串数据类型更改为varchar2并添加了一个简化的初始分区。 process_hour可能希望成为一种数字类型,具体取决于您将如何使用它。由于我不知道您选择当前数据类型的原因,因此很难说出哪些更合适。

我真的不明白为什么你希望分区范围是每小时和间隔为一天,除非你希望分区来自中午到中午;在这种情况下,初始分区(test_part_0)必须指定该时间,并且您的范围规范仍然是错误的。

答案 1 :(得分:1)

间隔分区只能在一列上构建。

在您的情况下,您有适当的分区键列 - CHARGE_DATE_TIME。为什么要将虚拟列创建为VARCHAR2?为什么需要在它们上创建分区键?间隔分区只能在NUMBER或DATE列上构建。