oracle - 使用 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”
那我可以在这里做什么?
解决方案
你不能那样做。遵循文档
创建范围分区表
CREATE TABLE 语句的 PARTITION BY RANGE 子句指定要对表或索引进行范围分区。PARTITION 子句标识单独的分区范围,并且 PARTITION 子句的可选子句可以指定特定于分区段的物理属性和其他属性。如果未在分区级别覆盖,分区将继承其基础表的属性。
VALUES LESS THAN 子句确定分区界限:分区键值比较小于子句指定的有序值列表的行存储在分区中。每个分区都有一个名称(sales_q1、sales_q2、...),每个分区都包含在一个单独的表空间(tsa、tsb、...)中。
这意味着范围是为键值确定的。sysdate
是一个函数,因此在执行之前它不是一个值。它不能是范围分区键值的一部分。
请记住目的或分区。想法是使用键列将大段(表)拆分为较小的段(分区)。在您的情况下,您希望将键列小于 sysdate-90 的行存储在一个分区中,这意味着今天该行将转到一个分区,但是如果满足条件 sysdate-90 在一天后,行应该移动到另一个分区。
如果您无论如何都想这样做,虽然我不推荐这样做,但您将不得不开发自己的维护流程:
- 该表具有每个日期的键(每个日期 3 个月的分区)
- 分区其他人将获得其他所有内容,因此任何与任何现有分区键都不匹配的内容。
- 每天您都必须检索满足条件的记录
sysdate-90
并将它们移动到其他分区。 - 为此,您需要在表中启用行移动:
alter table xx enable row movement
希望它澄清
推荐阅读
- scala - 如何扩展 ZIO 测试的 TestEnvironment
- java - 在 Java 上运行 Main 之外的程序
- asp.net-mvc - SameSite cookie 属性丢失
- c++ - 将新的 c++ Workspace 导入 Eclipse 并让 eclpise 识别函数关系等
- python - Flask 测试表单提交
- excel - 在不同列之间关联excel中的值
- react-native - 在 Azure DevOps 上运行的 Detox(反应原生)问题
- docker - docker使用的CGROUPS实现版本
- javascript - 带有 Hooks 的 React-Native 淡出动画
- python - Python dict 通过 JSON 和 Rails Action Cable web socket 到 Ruby 散列