ORA-06502: PL/SQL: numeric or value error: number precision too large
我正在尝试在 Oracle SQL Developer 中运行以下插入命令:
1
2 |
INSERT INTO work_comp_rates (company_id, work_comp_rt)
VALUES (‘101’, 0.11); |
这给了我这个错误:”ORA-06502: PL/SQL: numeric or value error: number precision too large”
附加了一个触发器:
1
2 3 4 5 6 7 8 9 10 11 12 13 14 |
CREATE OR REPLACE
TRIGGER APPS.work_codes_trig BEFORE INSERT OR UPDATE ON APPS.WORK_COMP_RATES FOR each ROW BEGIN IF inserting THEN IF :NEW.RID IS NULL THEN :NEW.RID := it_api.gen_pk; END IF; :NEW.CREATED_ON := sysdate; END IF; IF updating THEN :NEW.MODIFIED_ON := sysdate; END IF; END; |
如果我替换
1
|
:NEW.RID := it_api.gen_pk;
|
与
1
|
:NEW.RID := 599;
|
插入语句有效。
IT_API 正文:
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
CREATE OR REPLACE
package body it_api AS — generates and returns unique number used for primary key values FUNCTION gen_pk RETURN NUMBER IS l_pk NUMBER := 0; BEGIN FOR c1 IN ( SELECT to_number(sys_guid(),‘XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX’) pk FROM dual ) loop l_pk := c1.pk; exit; END loop; RETURN l_pk; END gen_pk; END it_api; |
我不太了解Oracle,而且那个脚本是别人写的。因此,感谢您的帮助!
- work_comp_rates 表中的列的数据类型是什么?您可以使用 SQLDeveloper 中的 DESC work_comp_rates 获得此信息。
- 此错误是因为您尝试将 ‘101’ 周围的引号插入到 company_id 中。尝试不带引号,例如 insert into work_comp_rates (company_id, work_comp_rt) values (101, 0.11);
- RID 列的精度是多少?错误可能是因为,to_number(sys_guid(),’XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX’) 产生的数字大于 RID 可以容纳的数字。
我创建了一个序列 rate_seq,将值递增 1 并替换
1
|
:NEW.RID := it_api.gen_pk;
|
与
1
2 3 |
SELECT rate_seq.nextval
INTO :NEW.rid FROM dual; |
这解决了问题。
来源:https://www.codenong.com/21867609/