我有一个带有数字列的表:
create table test (a number(2,0));
接下来我想根据a列创建一个虚拟列:
alter table test add (b varchar2(3) as ('A:'||to_char(a)));
这会导致错误:
ORA-12899: value too large for column "B" (actual: 12, maximum: 42)
为什么我会收到此错误?如果我用 substr 替换 to_char 这会起作用,但我很好奇 Oracle 如何确定“实际”和“最大值”值?
我怀疑最大值与数字类型的最大精度有关(Oracle 忽略了数据类型精度),但我仍然不太明白这个错误。字符集是 UTF-8。
显示的错误消息有些奇怪,但是当您收到此消息创建虚拟列时,值
maximum
是您需要指定才能创建列的最小长度。这样做的原因是 Oracle 不知道表达式的最大长度,
to_char(a)
并假设它将是 40 个字符:38 位精度的数字,加上每个小数点和正/负指示符的 1。为“A:”添加2个字符,Oracle判断为“安全”的最小长度为42。
使用您的格式
to_char
:有趣的是,Oracle 在 11.2.0.3.0 版本中似乎没有检查这种情况下的实际长度: