每个月 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));
如前所述,您永远不应将日期或时间值存储为字符串,请始终使用正确的 DATE
或 TIMESTAMP
数据类型。
作为解决方法,您可以像这样使用 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'));
我们有一个 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));
如前所述,您永远不应将日期或时间值存储为字符串,请始终使用正确的 DATE
或 TIMESTAMP
数据类型。
作为解决方法,您可以像这样使用 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'));