2015-02-06 167 views
0

我试图在谷歌搜索我的情况,但没有人谈论这种情况。Oracle分区间隔2列间隔

我有一个表即将分割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

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

只能指定一个分区键列,并且它必须是数字,日期,FLOAT,或TIMESTAMP数据类型。

我不知道为什么你分裂的日期和时间分成不同的列(因为日期有时间分量反正),或者为什么要存储的“真实”的日期和数字值串;只要首先使用正确的数据类型的列就简单多了。但是,假设你是在存储数据的方式设置,并且需要单独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)必须指定该时间,并且您的范围规范仍然是错误的。

+0

数据量非常巨大,我们需要运行这个过程每小时这就是为什么我们要分开这个过程。 – macieira 2015-02-08 12:10:10

1

间隔分区只能在一列之上。

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

+0

'charge_date_time'虽然是一个字符串,所以它不能直接用于间隔。 (为什么它是一个字符串是一个完整的其他问题...) – 2015-02-06 10:03:35

+0

好点。我错过了那个 – Rusty 2015-02-06 12:02:34

+0

我们显示这个信息没有Web应用程序。最好是String。我找到了解决方案。我已将小时用作子分区。 – macieira 2015-02-08 12:08:02