Oracle APEX执行INSERT语句触发ORA-01438精度超限错误求助
解决ORA-01438: value larger than specified precision allowed for this column错误
报错的原因是两个字段的插入值超出了定义的精度限制:
- COUNTER字段溢出:表中
COUNTER被定义为NUMBER(1),仅能存储0-9的整数,但你的脚本通过CONNECT BY level <=10000000生成1到1000万的序列值,当level超过9时,必然超出字段精度。 - RAN_INT字段溢出:
RAN_INT定义为NUMBER(1),而DBMS_RANDOM.VALUE(0,10)返回0到10之间的浮点数(例如9.999),Oracle会自动对其进行四舍五入,结果可能得到10,超出NUMBER(1)的最大值9。
修改后的完整脚本
1. 调整表结构,修正字段精度
CREATE TABLE FIRST( ROW_UNIQUE_SEQ_ID NUMBER(20), FIXED_ALPHA VARCHAR(5), COUNTER NUMBER(7), -- 改为NUMBER(7),足够存储1000万以内的整数 RAN_ALPHA VARCHAR(8), RAN_INT NUMBER(1), -- 若保留该类型,需确保插入值为0-9 FIXED_INT NUMBER(1), CREATED_UNIQUE_TIMESTAMP TIMESTAMP(2) )LOGGING NOCOMPRESS NOCACHE NOPARALLEL MONITORING;
2. 修改插入语句,确保随机整数符合字段要求
INSERT INTO FIRST( ROW_UNIQUE_SEQ_ID, FIXED_ALPHA, COUNTER, RAN_ALPHA, RAN_INT, FIXED_INT, CREATED_UNIQUE_TIMESTAMP ) SELECT level, 'GGGGG' AS FIXED_ALPHA, level AS COUNTER, DBMS_RANDOM.STRING('u',8) AS RAN_ALPHA, TRUNC(DBMS_RANDOM.VALUE(0, 10)) AS RAN_INT, -- 用TRUNC取整,生成0-9的整数 5 AS FIXED_INT, LOCALTIMESTAMP(2)+level/24/60/60 FROM dual CONNECT BY level <=10000000; COMMIT;
补充说明
- 如果未来需要存储更大的
COUNTER值,可以将其精度调整为NUMBER(10),确保足够容纳更大的序列数。 - 若希望
RAN_INT能存储0-10的整数,可将字段类型改为NUMBER(2),无需修改插入语句的随机值生成部分。
内容的提问来源于stack exchange,提问作者Claire Cashmore
相关产品推荐
相关产品推荐

