首页 > 解决方案 > 使用 sysdate 在 oracle 中按范围分区

问题描述

我想动态创建取决于 sysdate 的分区,例如:

create table partition_interval_demo
( id         number(6)
, val        varchar2(50)
, date_create  date)
partition by range (sale_date) interval (interval '1' day)
( partition p1 values less than ((sysdate-90)));

但我有错误

“ORA-14019:分区绑定元素必须是以下之一:字符串、日期时间或间隔文字、数字或 MAXVALUE”

那我可以在这里做什么?

标签: oracleoracle12cdynamic-sqldatabase-partitioning

解决方案


你不能那样做。遵循文档

创建范围分区表

CREATE TABLE 语句的 PARTITION BY RANGE 子句指定要对表或索引进行范围分区。PARTITION 子句标识单独的分区范围,并且 PARTITION 子句的可选子句可以指定特定于分区段的物理属性和其他属性。如果未在分区级别覆盖,分区将继承其基础表的属性。

VALUES LESS THAN 子句确定分区界限:分区键值比较小于子句指定的有序值列表的行存储在分区中。每个分区都有一个名称(sales_q1、sales_q2、...),每个分区都包含在一个单独的表空间(tsa、tsb、...)中。

这意味着范围是为键值确定的。sysdate是一个函数,因此在执行之前它不是一个值。它不能是范围分区键值的一部分。

请记住目的或分区。想法是使用键列将大段(表)拆分为较小的段(分区)。在您的情况下,您希望将键列小于 sysdate-90 的行存储在一个分区中,这意味着今天该行将转到一个分区,但是如果满足条件 sysdate-90 在一天后,行应该移动到另一个分区。

如果您无论如何都想这样做,虽然我不推荐这样做,但您将不得不开发自己的维护流程:

  1. 该表具有每个日期的键(每个日期 3 个月的分区)
  2. 分区其他人将获得其他所有内容,因此任何与任何现有分区键都不匹配的内容。
  3. 每天您都必须检索满足条件的记录sysdate-90并将它们移动到其他分区。
  4. 为此,您需要在表中启用行移动:alter table xx enable row movement

希望它澄清


推荐阅读