引言
有了导入计划和导入方案,剩下的就是本地测试和线上实操。下面是实际工作步骤。Oracle内置数据类型有很多种,例如字符数据类型、数值数据类型、整型数据类型、日期和间隔数据类型、RAW数据类型、大对象数据类型、扩展数据类型。今日就折在了数值上了。

具象问题
按照数据组提供的表结构创建了表,在将csv文件导入到oracle库时遇到的错误问题如下:
ORA-01438: value larger than specified precision allowed for this column
翻译下就是
值大于此列允许的指定精度。
前同事在设置数据类型可能并没有考虑大很大的数值或者由于新数据的加入,之前设置的数据类型不能满足当前的数据存储进去。下面再来回顾和学习下这个数据类型。
Oracle版本疑问
我在做测试时,还发现了一个问题就是在11G和19C上都设置了同样的数据类型,却无法存储相同的数据,具体的原因我没有深究,也不知道如何下手,这里只讲述下问题以及发现的问题现象,也希望大佬们能教教我。
Oracle-11G
这个版本是我本地数据库和线上数据库,其中本地数据库对于Oracle-11G的版本,查询出来是 Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production ,数据库设置的字符集编码为 ZHS16GBK,而线上的数据库的编码设置为 AL32UTF8 。
我在测试使用11时,使用到的测试数据如下,创建表,插入数据,失败。???此处写了一个大大的问号❓
## 创建表
CREATE TABLE "TEST" (
"PRIMARY_ID" NUMBER,
"CAPITAL" NUMBER(10,3),
"ITEM_NAME" VARCHAR2(255 BYTE)
)
;
COMMENT ON COLUMN "TEST"."PRIMARY_ID" IS '主键-';
COMMENT ON COLUMN "TEST"."CAPITAL" IS '价格';
COMMENT ON COLUMN "TEST"."ITEM_NAME" IS '项目';
## 插入数据
INSERT INTO "TEST" ("PRIMARY_ID", "CAPITAL", "ITEM_NAME") VALUES
(21290151, '202412', 438048000);
INSERT INTO "TEST" ("PRIMARY_ID", "CAPITAL", "ITEM_NAME") VALUES
(21290152, '202412', 4380480);
INSERT INTO "TEST" ("PRIMARY_ID", "CAPITAL", "ITEM_NAME") VALUES
(21290153, '202412', 43804);Oracle-19C
对于Oracle-19C的版本,查询出来是Oracle Database 19c EE Extreme Perf Release 19.0.0.0.0 - Production字符集设置的编码为 ZHS16GBK 。测试数据同上,创建表,插入数据,成功。
## 创建表
CREATE TABLE "TEST" (
"PRIMARY_ID" NUMBER,
"CAPITAL" NUMBER(10,3),
"ITEM_NAME" VARCHAR2(255 BYTE)
)
;
COMMENT ON COLUMN "TEST"."PRIMARY_ID" IS '主键-';
COMMENT ON COLUMN "TEST"."CAPITAL" IS '价格';
COMMENT ON COLUMN "TEST"."ITEM_NAME" IS '项目';
## 插入数据
INSERT INTO "TEST" ("PRIMARY_ID", "CAPITAL", "ITEM_NAME") VALUES
(21290151, '202412', 438048000);
INSERT INTO "TEST" ("PRIMARY_ID", "CAPITAL", "ITEM_NAME") VALUES
(21290152, '202412', 4380480);
INSERT INTO "TEST" ("PRIMARY_ID", "CAPITAL", "ITEM_NAME") VALUES
(21290153, '202412', 43804);疑问点是什么
其实我的疑问很简单,就是为什么同样是NUMBER(10,3)类型的数据,在11G中无法插入到数据库,而在19C中是可以插入的。我也在网络上搜索了一下,并没有发现什么端倪。
Oracle 11g和19c中的NUMBER数据类型在核心功能和用途上保持一致,主要用于存储整数和小数,可以指定精度和小数位数。然而,在细节和特性上,两者可能存在一些差异,这些差异通常与数据库版本的整体改进和新特性相关,但具体针对NUMBER数据类型的直接变化并不显著。
数据类型NUMBER
【语法】
在oracle数据类型中,Oracle NUMBER数据类型用于存储可以是负数或正数的数值。NUMBER数据类型的语法如下:
NUMBER[(precision [, scale])]
【参数】
- precision:精度是数字中的位数,它的范围从1到38。这也就是说,在Oracle中,NUMBER中数字的全部位数,包括整数位数部分和小数部分位数之和。我出现的问题时的理解就是在这里掉入坑里了。
- scale:刻度是数字中小数点右侧的位数。它的范围从-84到127,当scale为0时,也可以写作为
NUMBER(p)。
【举例说明】
为了更进一步验证我都想发,可以提前大胆的猜测下。例如,数字1234.56的精度为6,小数位数为2。因此,要存储这个数字,您需要NUMBER(6,2),这是反向的推测。下面可以提供一个参考:

尝试解决办法
在不知道如何处理时,先尝试增加整数部分的长度,例如我这里将NUMBER(10, 3) 改为 NUMBER(20, 3) ,希望能容纳更多更大的数据。
修改语句如下:
ALTER TABLE "IT"."TXXXX_INFO_I" MODIFY (XXXX_CAPITAL NUMBER(20, 3));数据导入成功
更改后,数据可以正常插入到数据库中。成功截图如下:

总结
我写完这篇完全是懵懵的,希望抽空再来做一次测试验证,我还咩有弄清楚这个原因,只能先按照自己的想法来修改,先把数据存放进去。
[引用]




