尝试让此脚本在我的 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 中运行脚本,我希望将所有大值插入到表中。
运行该 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
来代替。