PL/SQL中 提供了各种各样的数值类型:NUMBER
,PLS_INTERGER
,SIMPLE_INTEGER
, INTEGER
,BINARY_FLOAT
,BINARY_DOUBLE
。NUMBER
, PLS_INTERGER
是最常用的数值类型。
#NUMBER
真正的十进制类型,可以表示整数和小数,Oracle中唯一的平台独立的数值类型,可以用于资金计算。
浮点数声明:
variable1 NUMBER;
支持的合法数值范围为[1.0E - 130, 1.0E126 - 1]
。进行算术运算时,小于最小值的值将得到结果0,大于最大值的值将得到结果未定义,这会导致运行时问题,但是却不会有异常产生,但是如果明确把在支持的数值范围之外的值赋值给变量,将会有异常被抛出。
定点数声明:
variable2 NUMBER (precision, scale)
precision是这个数中的有效数字的位数,scale为正数时,表示小数点右边的位数,为负数时,表示小数点左边的位数,scale影响了四舍五入的位置。
precision与scale都必须为字面量整数,不能是变量,常量。precision的合法范围为**[1, 38], scale的合法范围为[-84, 127]**.
#PLS_INTEGER
依赖硬件底层实现的有符号整数类型,有效范围为[-2147483648 , 2147483647]
。不能用于数据库的表中,是PL/SQL自有的一个类型。
PLS_INTEGER为速度设计,当用PLS_INTEGER类型的数值计算时,直接使用了硬件的底层机器指令,性能高于使用NUMBER类型做数值计算。但是如果计算过程涉及到频繁的在PL_INTERGER与NUMBER类型之间进行转换,则会影响效率,此时直接使用NUMBER也许是一个更好的选择。
#SUBTYPE
subtype
关键字用于创建一种“新的类型”,然而新创建的类型仅仅是在内建的基础类型基础上附加一个可选的约束,而不是一种全新的数据类型。
可以在任何声明区域声明自定义的新类型
SUBTYPE subtype_name IS base_type[(constraint)] [NOT NULL];
base_type
可以是数值类型,也可以是其他任何合法的类型,Oracle已经内建有一些SUBTYPE
,比如SIGNTYPE
只能有取值-1,0,1,POSITIVE
本质上就是一个取值范围为[1, 2147483647]的BINARY_INTEGER
, POSITIVEN
和POSITIVE
类似,但是不能为NULL
,此外,FLOAT
,INTEGER
,DECIMAL
这些类型本质上也都是基于对应的基础类型声明的SUBTYPE
。
subtype
在类型方面为pl/sql提供了更多一层的封装,可以让代码本身更具自表达性,使代码更易读,易维护。