ORACLE数值类型详解--NUMBER、FLOAT、BINARY_FLOAT、BINARY_DOUBLE、BINARY_INTEGER(三)
数据类型使用相同的typ),因为官方文档明确指出了PLS_INTEGER BINARY_INTEGER通number的一下区别:
1.存储空间要比number小
2.计算效率要比number高,因此可以直接硬件运算,而number是软运算。
如果赋值范围超出了PLS_INTEGER和BINARY_INTEGER的范围,将会发生溢出异常;
[sql]
DECLARE
p1 PLS_INTEGER := 2147483647;
p2 PLS_INTEGER := 1;
n NUMBER;
BEGIN
n := p1 + p2;
END;
/
Result:
DECLARE
*
ERROR at line 1:
ORA-01426: numeric overflow
ORA-06512: at line 6
在11g中,oracle引入了simple_integer,该类型是PLS_INTEGER的子类型,取值范围相同,但是该类型不会进行空值和溢出检测(必须人为保证非空和不会发生溢出),因此与PLS_INTEGER相比,具有更高的性能。如果可以确定某个值为非空并且不会发生溢出操作,可以使用simple_integer来存储。由于不会进行溢出检测,simple_integer的运算结果可能会发生正负值的转换,例如:
[sql]
DECLARE
n SIMPLE_INTEGER := 2147483645;
BEGIN
FOR j IN 1..4 LOOP
n := n + 1;
DBMS_OUTPUT.PUT_LINE(TO_CHAR(n, 'S9999999999'));
END LOOP;
FOR j IN 1..4 LOOP
n := n - 1;
DBMS_OUTPUT.PUT_LINE(TO_CHAR(n, 'S9999999999'));
END LOOP;
12 END;
13 /
+2147483646
+2147483647
-2147483648
-2147483647
-2147483648
+2147483647
+2147483646
+2147483645
PL/SQL 过程已成功完成。
如果将simple_integer转换为pls_integer, 会转换为pls_integer not null。
BINARY_FLOAT和BINARY_DOUBLE
oracle根据IEEE754实现单精度和双精度浮点型,要了解IEEE754,请参照http://blog.csdn.net/yidian815/article/details/12912661
由于存储结构上的不同,BINARY_FLOAT和BINARY_DOUBLE较number,可以存储更大范围的数据,但是其精度并不如number。如果存储金融数据,建议使用number,而如果进行科学运算,建议使用BINARY_FLOAT和BINARY_DOUBLE,因为浮点型数据使用的是硬件计算,其计算效率是非常高的。
我们可以通过如下方式来判断某个浮点型是否为无穷或者非数值。
expr is [not] NAN
expr is [not] INFINITE
ORACLE可以对NAN排序,排序规则是,NAN最大,NAN与NAN比较时,其值相等。infinity和infinity相比,其值相等。
[sql]
SQL> create table tab1(id number,c1 binary_float,c2 binary_double);
表已创建。
SQL> insert into tab1 values(1,1,1);
已创建 1 行。
SQL> insert into tab1 values(2,nan,nan);
insert into tab1 values(2,nan,nan)
*
第 1 行出现错误:
ORA-00984: 列在此处不允许
SQL> insert into tab1 values(2,binary_float_nan,binary_double_nan);
已创建 1 行。
SQL> insert into tab1 values(3,binary_float_infinity,binary_double_infinity);
已创建 1 行。
SQL> insert into tab1 values(4,-binary_float_infinity,-binary_double_infinity);
已创建 1 行。
SQL> commit;
提交完成。
SQL> select * from tab1;
ID C1 C2
------ ---------- ----------
1 1.0E+000 1.0E+000
2 Nan Nan
3 Inf Inf
4 -Inf -Inf
SQL> select * from tab1 order by c1;
ID C1 C2
------ ---------- ----------
4 -Inf -Inf
1 1.0E+000 1.0E+000
3 Inf Inf
2 Nan Nan
SQL> select * from tab1 where c1 is infinite;
ID C1 C2
------ ---------- ----------
3 Inf Inf
4 -Inf -Inf
SQL> select * from tab1 where c1 is nan;
ID C1 C2
------ ---------- ----------
2 Nan Nan
SQL> select * from tab1 where c1 = binary_float_infinity;
ID C1 C2
------ ---------- ----------
3 Inf Inf
SQL> select * from tab1 where c1 != binary_float_infinity;
ID C1 C2
------ ----------