关于oracle:ORA-06502: PL/SQL: numeric or value error: number precision too large | 珊瑚贝

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/

微信公众号
手机浏览(小程序)
0
分享到:
没有账号? 忘记密码?