ORA-01438:值大于 APEX Oracle INSERT INTO TABLE

问题描述 投票:0回答:1

尝试让此脚本在我的 APEX Oracle 工作区上运行。尝试生成随机整数/varchars 并将它们首先放入表中。这是我当前使用的脚本:


CREATE TABLE FIRST
(
ROW_UNIQUE_SEQ_ID NUMBER(20), 
FIXED_ALPHA VARCHAR(5),
COUNTER NUMBER(1),
RAN_ALPHA VARCHAR(8),
RAN_INT NUMBER(1),
FIXED_INT NUMBER(1),
CREATED_UNIQUE_TIMESTAMP TIMESTAMP(2) 
)
LOGGING
NOCOMPRESS
NOCACHE
NOPARALLEL
MONITORING;

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,
DBMS_RANDOM.VALUE(0, 10) AS RAN_INT,
5 AS FIXED_INT,
LOCALTIMESTAMP(2)+level/24/60/60 FROM dual
CONNECT BY level <=10000000;
COMMIT;


每次运行它时,我都会收到有关 INSERT INTO 语句的错误消息:

INSERT INTO FIRST(ROW_UNIQUE_SEQ_ID,FIXED_ALPHA,COUNTER,RAN_... ORA-01438: 值大于此列允许的指定精度

我尝试在 APEX 中运行脚本,我希望将所有大值插入到表中。

sql oracle-apex
1个回答
0
投票

运行该 select 语句可以准确显示发生了什么:

列 RAN_INT 确实具有精度 - 但它被定义为 NUMBER(1)。 文档状态:

DBMS_RANDOM.VALUE produces numbers in [0,1) with 38 digits of precision.

解决方案: 代替

DBMS_RANDOM.VALUE(0, 10) AS RAN_INT,
FLOOR(DBMS_RANDOM.VALUE(0, 10)) AS RAN_INT,

但是,还有一个问题。 COUNTER 列也定义为 NUMBER(1),因此它只接受数字 1 到 9,并在第 10 行出现相同的错误。

解决方案: 使用数据类型

NUMBER
而不是
NUMBER(1)

创建表

此外,Oracle 不建议使用数据类型

VARCHAR
。请使用
VARCHAR2
来代替。

© www.soinside.com 2019 - 2024. All rights reserved.