plsql programming 09 数字
number 类型, 十进制数据类型(平台无关的)
pls_integer 和 binary_integer 这两种数据类型和你底层硬件表示整数的方法完全一致, 这两种类型的运算是利用硬件原生, 机器指令执行的, 你不能再数据库中保存这些类型的值.
binary_float 和 binary_double 一般用于浮点数计算
number 类型, number(9,2) // 注意, 这里的9是9位精度, 表示有效数字要包含2位小数, 所以这个数的最大值是 9 999 999.99
number(9,11) // .00999999999, 其中 有效数字是9个, 而小数点后边的位数是11位.
number(9, -11) // 99999999900000000000 , 这种形式尽量少用, 看着迷糊
pls_integer 类型是为了运算速度, 因为 pls_integer 是整数, 因此在移植硬件平台时不会遇到兼容性问题, 但是如果使用pls_integer时要经常和 number类型互相转换, 那还是从一开始就使用number类型更好.
binary_integer 类型, 不推荐使用
simple_integer 类型 和 pls_integer 相同的取值范围, 只是它没有溢出, 也不支持 null, 所以如果你设计的列既没有null 也不可能溢出, 那么选用这种类型会有很好的性能.
例如: 下列代码, 可以比较 procedure 运行
1: -- chap09_01.sql
2: create or replace procedure pls_test(interations in pls_integer) -- result: 590000
3: as
4: int1 pls_integer := 1;
5: int2 pls_integer := 2;
6: begints timestamp;
7: endts timestamp;
8: begin
9: begints := systimestamp;
10:
11: for cnt IN 1 .. iterations
12: loop
13: int1 := int1 + int2 * cnt;
14: end loop;
15:
16: endts := systimestamp;
17: dbms_output.put_line( iterations
18: || ' iterations had run time of:'
19: || to_char(endts - begints));
20: end;
21: /
22:
23: -- chap09_02.sql
24: -- simple_integer 是 11g 之后才有的, 所以目前测试不了
25: create or replace procedure pls_test(interations in simple_integer) -- result: 590000
26: as
27: int1 simple_integer := 1;
28: int2 simple_integer := 2;
29: begints timestamp;
30: endts timestamp;
31: begin
32: begints := systimestamp;
33:
34: for cnt IN 1 .. iterations
35: loop
36: int1 := int1 + int2 * cnt;
37: end loop;
38:
39: endts := systimestamp;
40: dbms_output.put_line( iterations
41: || ' iterations had run time of:'
42: || to_char(endts - begints));
43: end;
44: /
to_number 函数
to_char
cast 也是 字符串与数字之间来回转换的.
ceil : 返回最小整数
floor : 返回 <= 指定值得最大整数, 这个整数相当于指定值的”下限”
round : 对一个数字执行4舍5入.
trunc : 把一个数字按照指定的小数位数截断.
ABS: 绝对值
SQRT: 平方根