oracle - 获得较小数字的数字溢出错误,但获得较大数字的成功
问题描述
以下是我的测试功能:
create or replace FUNCTION test
RETURN NUMBER
AS
v_count number(15);
v_msisdn number(15);
BEGIN
v_msisdn:= 225952 * 10000;
-- v_msisdn:=50510060853 * 10000;
return v_msisdn;
END;
当我执行该功能时
select test() from dual;
我收到一个错误
1426. 00000 - "numeric overflow"
*Cause: Evaluation of an value expression causes an overflow/underflow.
但是,如果我更新
v_msisdn:=50510060853 * 10000;
我没有收到错误。
有人可以解释这种行为,因为第二个查询是一个更大的数字吗?
解决方案
您可以通过将整数文字之一转换为integer
or来解决此问题number
:
v_msisdn:= cast(225952 as integer) * 10000;
pls_integer
出于性能原因,小整数文字被视为相同。不幸的是,这种类型在溢出时引发异常:
具有两个溢出 PLS_INTEGER 范围的 PLS_INTEGER 值的计算会引发溢出异常,即使您将结果分配给 NUMBER 数据类型 对于 PLS_INTEGER 范围之外的计算,请使用 INTEGER,这是 NUMBER 数据类型的预定义子类型。
在您的第二个示例中,其中一个值 (50510060853) 不适合的范围pls_integer
,因此被解释为integer
.
这是 AskTom 上的类似问题:Datatype Number results in Numeric overflow 尽管值足够小
推荐阅读
- elasticsearch - 应用程序的弹性 SIEM?
- ios - 如何在 SwiftUI 应用程序中访问 MockedObject
- php - ACF 按日期订购,从今天开始
- linux - 尝试使用 linux 服务器设置 VSC 远程开发
- python - 如何在python中加载网页加载时触发的所有API?
- sql - 时间戳功能是否考虑 bigquery 中的夏令时
- pyspark - PySpark:PySpark 序列函数中的日期间隔?
- arrays - 在c语言中询问用户他的名字,如果名字在数据库中,打印“欢迎(名字)”,如果不是打印“名字不在数据库中
- python - 进入while循环,即使它是假的
- javascript - 如何指导 React-Quill 应用内联样式而不是类?