ORA-06502: PL/SQL: 数字或值错误: 数字精度太大
Posted
技术标签:
【中文标题】ORA-06502: PL/SQL: 数字或值错误: 数字精度太大【英文标题】:ORA-06502: PL/SQL: numeric or value error: number precision too large 【发布时间】:2014-02-18 23:15:52 【问题描述】:我正在尝试在 Oracle SQL Developer 中运行以下插入命令:
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”
附加了一个触发器:
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;
如果我替换
:NEW.RID := it_api.gen_pk;
与
:NEW.RID := 599;
插入语句有效。
IT_API 正文:
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 可以容纳的数字。
【参考方案1】:
我创建了一个序列 rate_seq,将值递增 1 并替换
:NEW.RID := it_api.gen_pk;
与
select rate_seq.nextval
into :new.rid
from dual;
这解决了问题。
【讨论】:
以上是关于ORA-06502: PL/SQL: 数字或值错误: 数字精度太大的主要内容,如果未能解决你的问题,请参考以下文章
ORA-06502: PL/SQL: 数字或值错误: 字符到数字的转换错误
ORA-06502: PL/SQL: 数字或值错误: NULL 索引表键值
ORA-06502: PL/SQL: 数字或值错误: 数字精度太大
获取 ORA-06502:PL/SQL:数字或值错误:SQL 触发器中的字符到数字转换错误