You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 16:32:59