Oracle11g关于分区表的问题

nightgoblin 2020-08-05 03:37:01
数据库版本:oracle11g 11.2.0.4.0
目前库有张表需要分区,做范围分区,按照每个月自动分区,但是现在有个问题,就是分区的时间字段有null值,插入数据时会报ORA-14300。
解决方法一:就是在插入数据时,将NULL值转化为一个时间。
解决方法二:插入NULL值时,自动将NULL放入另一个分区,插入非NULL值,也就是时间时,写入时间分区。
方法一这个好解决,但方法二不知道怎么弄。
下面是使用RANGE-LIST创建分区,但插入数据时还是会报ORA-14300错误。
现在就是想创建复合分区,把正常的时间写入RANGE分区,如果有NULL值写入LIST分区。
都是同一个分区字段,例如:CREATE_TIME
不知道怎么来实现,请高人解答,谢谢!
下面是RANGE-LIST,但插入数据会报报ORA-14300错误:

CREATE TABLE T_TEST
(
TABLE_ID VARCHAR2(64) NOT NULL,
CREATE_TIME DATE DEFAULT SYSDATE
)
PARTITION BY RANGE (CREATE_TIME)
INTERVAL(NUMTOYMINTERVAL(1, 'MONTH')) STORE IN (TBS_TEST_DATA)
SUBPARTITION BY LIST(CREATE_TIME)
SUBPARTITION TEMPLATE(
SUBPARTITION SP_0 VALUES(NULL) TABLESPACE TBS_TEST_DATA)
(PARTITION P_0 VALUES LESS THAN (TO_DATE('1970-01-01', 'YYYY-MM-DD')) TABLESPACE TBS_TEST_DATA);


INSERT INTO T_TEST (TABLE_ID,CREATE_TIME) VALUES ('test01',NULL);
COMMIT;




...全文
227 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
lhdz_bj 2020-08-07
  • 打赏
  • 举报
回复
引用 楼主 nightgoblin 的回复:
数据库版本:oracle11g 11.2.0.4.0
目前库有张表需要分区,做范围分区,按照每个月自动分区,但是现在有个问题,就是分区的时间字段有null值,插入数据时会报ORA-14300。
解决方法一:就是在插入数据时,将NULL值转化为一个时间。
解决方法二:插入NULL值时,自动将NULL放入另一个分区,插入非NULL值,也就是时间时,写入时间分区。
方法一这个好解决,但方法二不知道怎么弄。
下面是使用RANGE-LIST创建分区,但插入数据时还是会报ORA-14300错误。
现在就是想创建复合分区,把正常的时间写入RANGE分区,如果有NULL值写入LIST分区。
都是同一个分区字段,例如:CREATE_TIME
不知道怎么来实现,请高人解答,谢谢!
下面是RANGE-LIST,但插入数据会报报ORA-14300错误:

CREATE TABLE T_TEST
(
TABLE_ID VARCHAR2(64) NOT NULL,
CREATE_TIME DATE DEFAULT SYSDATE
)
PARTITION BY RANGE (CREATE_TIME)
INTERVAL(NUMTOYMINTERVAL(1, 'MONTH')) STORE IN (TBS_TEST_DATA)
SUBPARTITION BY LIST(CREATE_TIME)
SUBPARTITION TEMPLATE(
SUBPARTITION SP_0 VALUES(NULL) TABLESPACE TBS_TEST_DATA)
(PARTITION P_0 VALUES LESS THAN (TO_DATE('1970-01-01', 'YYYY-MM-DD')) TABLESPACE TBS_TEST_DATA);


INSERT INTO T_TEST (TABLE_ID,CREATE_TIME) VALUES ('test01',NULL);
COMMIT;


1、你用range+list复合分区解决不了这个问题,楼主对复合索引可以在加深下理解;
2、你可以将null转换成时间,但需要为这个时间建立一个单独分区,比如:partition pnull values less than (to_date('0001-12-1', 'yyyy-mm-dd');
3、此外,你也可以创建分区表时建上maxvalue分区(如下所示),因为null比任何值都大,这样null将来都会insert到这个分区,但建这个分区可能会给后期维护增加了复杂性。
create table t5(c1 date) partition by range (c1)
(
partition p1 values less than (to_date('2020-02-1', 'yyyy-mm-dd')),
partition p2 values less than (to_date('2020-03-1', 'yyyy-mm-dd')),
partition p3 values less than (to_date('2020-04-1', 'yyyy-mm-dd')),
partition p4 values less than (to_date('2020-05-1', 'yyyy-mm-dd')),
partition p5 values less than (to_date('2020-06-1', 'yyyy-mm-dd')),
partition p6 values less than (to_date('2020-07-1', 'yyyy-mm-dd')),
partition p7 values less than (to_date('2020-08-1', 'yyyy-mm-dd')),
partition p8 values less than (to_date('2020-09-1', 'yyyy-mm-dd')),
partition p300 values less than (maxvalue)
);
nayi_224 2020-08-06
  • 打赏
  • 举报
回复
别分区了,直接分表吧
  • 打赏
  • 举报
回复
就用方法1啊,2就行不通
miqi_oracle 2020-08-05
  • 打赏
  • 举报
回复
null即不属于任何一个范围也无法列出

3,491

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧