每个月 CHAR/VARCHAR2 数据类型的范围分区

Range partition on CHAR/VARCHAR2 data type for every month

我们有一个 table,我们正在尝试为每个月创建一个基于 CHAR 数据类型的 RANGE 分区,如下所述。但是我们得到的 errors.The ACC_DATE 值将类似于“202010”。这在ORACLE中可以完成吗?因为在 DB2 中也可以这样做。但是我们必须在ORACLE中实现它。

我们得到错误:

ORA-14751: Invalid data type for partitioning column of an interval partitioned table

CREATE TABLE T_ACCOUNT_PARTITION
(
    V_ACCOUNT_NUM  VARCHAR2(100 CHAR),
    V_ACCOUNT_NAME VARCHAR2(200 CHAR),
    ACC_DATE CHAR(6)
)
PARTITION BY RANGE (ACC_DATE) INTERVAL (NUMTOYMINTERVAL(1, 'MONTH'))
(PARTITION P_MAY2021 VALUES LESS THAN (202105));

如前所述,您永远不应将日期或时间值存储为字符串,请始终使用正确的 DATETIMESTAMP 数据类型。

作为解决方法,您可以像这样使用 VIRTUAL 列:

CREATE TABLE T_ACCOUNT_PARTITION
(
    V_ACCOUNT_NUM  VARCHAR2(100 CHAR),
    V_ACCOUNT_NAME VARCHAR2(200 CHAR),
    ACC_DATE CHAR(6),
    PARTITION_KEY TIMESTAMP(0) GENERATED ALWAYS AS (TO_TIMESTAMP(ACC_DATE, 'YYYYMM')),
    
)
PARTITION BY RANGE (PARTITION_KEY) INTERVAL (NUMTOYMINTERVAL(1, 'MONTH'))
(PARTITION P_MAY2021 VALUES LESS THAN (TIMESTAMP '2021-05-01 00:00:00'));