问题现象
在 OceanBase 数据库的 Oracle 租户下,创建表的过程中,如果表中存在虚拟列时,报 ORA-12899: value too large for column 错误,现象如下。
obclient [SYS]> CREATE TABLE OBTEST( col1 VARCHAR2(20BYTE) NOT NULL, col2 DATE, SYS_NC00053$ VARCHAR2(5 BYTE) GENERATED ALWAYS AS(TO_CHAR(col2,'MM-dd')) VIRTUAL );
ORA-12899: value too large for column
问题原因
表达式 TO_CHAR(col2,'MM-dd') 的结果,确实是一个 5 字节的字符串,故用 VARCHAR2(5 BYTE) 的GENERATED column 理论上是可以存储它的,但是 OceanBase 数据库内部对 GENERATED column 的要求是要大于等于表达式自身的长度,而不是只检查表达式的结果长度。
适用版本
OceanBase 数据库 V2.2.77 版本。
解决方法
需要让 GENERATED column 的大小大于表达式长度,而不是大于表达式结果的长度。