我试图在谷歌上找到我的情况,但没有人谈论这种情况。
我有一张桌子,可以用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
答案 0 :(得分:2)
如果您的范围有多个列,则无法使用间隔;你得到:ORA-14750:带有INTERVAL子句的范围分区表有多个列。 From the documentaion:
您只能指定一个分区键列,它必须是NUMBER,DATE,FLOAT或TIMESTAMP数据类型。
我不确定您为什么要将日期和小时拆分为单独的列(因为日期还有时间组件),或者为什么要存储' real& #39;日期和数字值作为字符串;首先只有具有正确数据类型的列会更简单。但假设您已设置以这种方式存储数据并且需要单独的process_date
和process_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列上构建。