Oracle PL/SQL Programming 读书笔记(Numbers)
Numbers
1.基本数字类型
NUMBER
可以存储任何大小的 integer, fixed-point, or floating-point numbers。他是平台无关的,在任何硬件平台上,在 NUMBER 上的计算结果都是相同的。Oracle database engin 和 PL/SQL engin 都支持。
DECLARE x NUMBER; --floating-point number
y NUMBER (precision, scale) --fixed-point number
precision 1 ~ 38 scale -84 ~ 127
三种情况:
(1)precision > scale > 0 NUMBER(9,2)
precision-scale.scale 000000000.00 ~ 9999999.99
(2)precision < scale NUMBER(9,11) 可以存储很小的数,精确度很高
precisionE-scale 0.00000000000 ~ 0.00999999999
(3)scale < 0 NUMBER(9,-11) 可以存储很大的数,但精确度很低
precisionE-scale 00000000000 ~ 99999999900000000000
z NUMBER(precision,0); = z NUMBER(precision); --integer number
PLS_INTEGER and BINARY_INTEGER(只由 PL/SQL engin 支持)
PLS_INTEGER:
Values are represented using your hardware platform's native integer format.
范围:-2,147,483,647 ~ 2,147,483,647
使用 native machine arithmetic 进行计算,所以速度很快。但当其和 NUMBER 进行频繁转换时会降低性能,所以在进行整数计算,或者循环计数器时,应该一开始就使用 PLS_INTEGER。
BINARY_INTEGER:
以二进制形式存储带符号整数。
在 Oracle Database 10g Release 1 之前,BINARY_INTEGER 是平台无关的;自 10g Release 1 开始,他和 PLS_INTEGER 是一样的。
一般不用 BINARY_INTEGER,除非使用 Oracle 7.3 之前的版本,在那之前没有 PLS_INTEGER。
BINARY_FLOAT and BINARY_DOUBLE(PL/SQL and the database engine 都支持)
10g 之后引入的 floating-point types。
BINARY_FLOAT BINARY_DOUBLE NUMBER
Maximum absolute value 3.40282347E+38F 1.7976931348623157E+308 9.999...999E+121 (38 9s total)
Minimum absolute value 1.17549435E-38F 2.2250748585072014E-308 1.0E-127
Number of bytes used for the value 4 (32 bits) 8 (64 bits) varies from 1 to 20
Number of length bytes 0 0 1
Representation Binary, IEEE-754 Binary, IEEE-754 Decimal
Literal suffix f d None
不建议在不需要精确表示或计算小数的地方使用这两个类型,比如货币。当进行大数据量计算(extensive calculations.)时,这两个数据类型的性能更好。
当混合使用 BINARY_DOUBLE, BINARY_FLOAT, and NUMBER 时,他们的优先顺序是 BINARY_DOUBLE > BINARY_FLOAT > NUMBER,当计算时默认会把表达式中的不同类型,转换为优先顺序高的数据类型,当然你可以通过 TO_NUMBER, TO_BINARY_FLOAT, and TO_BINARY_DOUBLE 等按自己的意愿显示转换。
2.数字子类型
子类型是为了兼容 ISO SQL, SQL/DS, and DB2 的数据类型而产生的,基本上是三大基本数字类型的别名或子集。
Subtype Compatibility Corresponding Oracle datatype/notes
DEC (precision, scale) ANSI NUMBER (precision, scale)
DECIMAL (precision, scale) IBM NUMBER (precision, scale)
DOUBLE PRECISION ANSI NUMBER, with 126 binary digits of precision
FLOAT ANSI, IBM NUMBER, but with a precision of 126 binary digits
FLOAT (binary_precision) ANSI, IBM NUMBER, but with a binary_precision of up to 126 (the default)
INT ANSI NUMBER
INTEGER ANSI, IBM NUMBER
NATURAL N/A PLS_INTEGER*, but allows only nonnegative values (0 and higher)
NATURALN N/A Same as NATURAL, but with the additional restriction of never being NULL
NUMERIC (precision, scale) ANSI NUMBER (precision, scale)
POSITIVE N/A PLS_INTEGER*, but allows only positive values (1 and higher)
POSITIVEN N/A Same as POSITIVE, but with the additional restriction of never being NULL
REAL ANSI NUMBER, with 63 binary digits of precision.
SIGNTYPE N/A PLS_INTEGER*, limited to the values -1, 0, and 1
SMALLINT ANSI, IBM NUMBER (38)
* BINARY_INTEGER prior to Oracle Database 10g
3.类型转换
TO_NUMBER、TO_BINARY_FLOAT、TO_BINARY_DOUBLE (后两者与第一个相似) Function
语法:TO_NUMBER(string [,format [,nls_params]])
其中 string 是一个表示数字的字符串,对于 TO_BINARY_FLOAT、TO_BINARY_DOUBLE 来说,可以用 'INF' and '-INF' 表示正负无穷大,'NaN' 表示 "not a number."
符合以下情况时,可以不指定 format 直接转换:
1.string 只包含数字和一个小数点
2.如果开头是符号,必须是 +/-
3.科学表示法,必须符合以下形式:1.25E2
当使用 format 时,fortmat 中小数点左边右边的位数,不能小于 string 中相应的位数,但可以大于。
几个 format 参数:
D:decimal character (NLS_NUMERIC_CHARACTER 第一个符号决定)
G:group separator (NLS_NUMERIC_CHARACTER 第二个符号决定)
L:local currency symbol (NLS_CURRENCY 决定)
例子:a := TO_NUMBER('$123,456.78','L999G999G999D99');
nls_params:可以用 nls_params 覆盖默认的 NLS 参数,但只能使用 NLS_NUMERIC_CHARACTERS, NLS_CURRENCY, and NLS_ISO_CURRENCY 三个参数(应该避免在代码中使用该参数,而在 session 级别作修改)。
TO_CHAR Function
语法:TO_CHAR(number [,format [,nls_params]])
几个 format 参数:
B:使 0 为空白,不管 '0' 参数
0:使用 0 填补位数
例子:
DECLARE
b VARCHAR2(30);
c VARCHAR2(30);
BEGIN
b := TO_CHAR(123.01,'LB000G000G009D99');
DBMS_OUTPUT.PUT_LINE(b);
b := TO_CHAR(0,'LB000G000G009D99');
DBMS_OUTPUT.PUT_LINE(b);
END;
The output is:
$000,000,123.01
当转换为 string 时,如果 format 中小数点左边的位数比实际的少,Oracle 会输出 '#',但如果小数点右边的少,Oracle 会自动四舍五入。
如果为正数,转换之后,Oracle 默认会在 string 的第一个数字前面预留一个空白字符,为了和负数保持统一。如果使用 'PR' 参数,则前后都会预留。可以使用 'TM' 参数(8i 之后),或者 LTRIM/RTRIM 消除预留空格。
CAST Function
语法:CAST (expression AS datatype)
可以在数字、字符串之间自由转换,但不支持 format models,他是 ISO SQL standard 中的。
4.数字相关的函数
所有的相关函数都定义在 STANDARD 包中(standard.sql)
4.1 Rounding and Truncation Functions
Function Summary
CEIL 返回大于或等于指定值的最小整数。
FLOOR 返回小于或等于指定值的最大整数。
ROUND ROUND ( number [, integer ] ) 四舍五入。integer 默认为 0,四舍五入为整数;若 integer > 0,四舍五入至小数点右边 integer 位;若 integer < 0,四舍五入至小数点左边 integer 位。
TRUNC TRUNC ( n [, m] ) 截断。m 默认为 0,截断小数部分;若 m > 0,截断至小数点右边 m 位;若 m < 0,截断至小数点左边 m 位。
4.2 三角函数
三角函数中用的参数全都是弧度不是角度。
转换:
radians = p * degrees / 180 -- From degrees to radians
degrees = radians * 180 / p -- From radians to degrees
p 的表示方法:
p = ACOS (-1)