1、一、DUMP()函数DUMP(w,x,y,z)【功能】返回数据类型、字节长度和在内部的存储位置.【参数】w 为各种类型的字符串(如字符型、数值型、日期型 )x 为返回位置用什么方式表达,可为:8,10,16 或 17,分别表示:8/10/16 进制和字符型,默认为 10。y 和 z 决定了内部参数位置【返回】类型 ,符号/指数位 数字 1,数字 2,数字 3,数字 20如:Typ=2 Len=7: 60,89,67,45,23,11,102SELECT DUMP(ABC,1016) FROM dual; 返回结果为:Typ=96 Len=3 CharacterSet=ZHS16GBK: 41,
2、42,43 代码 数据类型0 对应 VARCHAR21 对应 NUMBER8 对应 LONG12 对应 DATE23 对应 RAW24 对应 LONG RAW69 对应 ROWID96 对应 CHAR106 对应 MSSLABEL各位的含义如下:1.类型: Number 型,Type=2 (类型代码可以从 Oracle 的文档上查到 )2.长度:指存储的字节数3.符号/指数位在存储上,Oracle 对正数和负数分别进行存储转换:正数:加 1 存储(为了避免 Null)负数:被 101 减,如果总长度小于 21 个字节,最后加一个 102(是为了排序的需要)指数位换算:正数:指数=符号/指数位
3、- 193 (最高位为 1 是代表正数) 负数:指数=62 - 第一字节4.从开始是有效的数据位从开始是最高有效位,所存储的数值计算方法为:将下面计算的结果加起来:每个乘以 100(指数-N) (N 是有效位数的顺序位,第一个有效位的 N=0)5、举例说明SQL select dump(123456.789) from dual;返回:Typ=2 Len=6: 195,13,35,57,79,91: 195 - 193 = 2 13 - 1 = 12 *100(2-0) 120000 35 - 1 = 34 *100(2-1) 3400 57 - 1 = 56 *100(2-2) 56 79
4、- 1 = 78 *100(2-3) .78 91 - 1 = 90 *100(2-4) .009 123456.789 SQL select dump(-123456.789) from dual;返回:Typ=2 Len=7: 60,89,67,45,23,11,102算法:62 - 60 = 2(最高位是 0,代表为负数) 101 - 89 = 12 *100(2-0) 120000 101 - 67 = 34 *100(2-1) 3400 101 - 45 = 56 *100(2-2) 56 101 - 23 = 78 *100(2-3) .78 101 - 11 = 90 *100(
5、2-4) .009 123456.789(-) 现在再考虑一下为什么在最后加 102 是为了排序的需要,-123456.789 在数据库中实际存储为60,89,67,45,23,11 而-123456.78901 在数据库中实际存储为 60,89,67,45,23,11,91 可见,如果不在最后加上 102,在排序时会出现-123456.789 select CONVERT(datatype, US7ASCII ) from BSTH_SYS_FIELD_ALIAS;CONVERT(DATATYPE,US7ASCII)-gfdfghdf?SQL select CONVERT(datatype, ZHS16GBK ) from BSTH_SYS_FIELD_ALIAS;CONVERT(DATATYPE,ZHS16GBK)-gfdfghdf中文