oracle dump函数


一、函数标准格式:
 
DUMP(expr[,return_fmt[,start_position][,length]])
 
基本参数时4个,最少可以填的参数是0个。当完全没有参数时,直接返回null。另外3个参数也都有各自的默认值:
expr:这个参数是要进行分析的表达式(数字或字符串等,可以是各个类型的值)
return_fmt:指返回参数的格式,有5种用法:
          1)8:以8进制返回结果的值
          2)10:以10进制返回结果的值(默认)
          3)16:以16进制返回结果的值
          4)17:以单字符的形式返回结果的值
          5)1000:以上4种加上1000,表示在返回值中加上当前字符集
start_position:开始进行返回的字符位置
length:需要返回的字符长度
 
 
二、示例
 
SYS@ tsid > select dump('abc') from dual;
 
DUMP('ABC')
----------------------
Typ=96 Len=3: 97,98,99
 
SYS@ tsid > select dump('abc',16) from dual;
 
DUMP('ABC',16)
----------------------
Typ=96 Len=3: 61,62,63
 
SYS@ tsid > select dump('abc',1016) from dual;
 
DUMP('ABC',1016)
--------------------------------------------
Typ=96 Len=3 CharacterSet=ZHS16GBK: 61,62,63
 
SYS@ tsid > select dump('abc',17,2,2) from dual;
 
DUMP('ABC',17,2,2
-----------------
Typ=96 Len=3: b,c
 
 
结果的格式一般都是类似:Typ=96 Len=3 [CharacterSet=ZHS16GBK]: 61,62,63
 
1、type
 
typ表示当前的expr值的类型。如:2表示NUMBER,96表示CHAR。
 
CODE TYP
----- ------------------------------
1     VARCHAR2
2     NUMBER
8     LONG
12    DATE
23    RAW
24    LONG RAW
69    ROWID
96    CHAR
112   CLOB
113   BLOB
114   BFILE
180   TIMESTAMP
181   TIMESTAMP WITH TIMEZONE
182   INTERVAL YEAR TO MONTH
183   INTERVAL DAY TO SECOND
208   UROWID
231   TIMESTAMP WITH LOCAL TIMEZONE
 
2、len
 
len表示该值所占用的字节数。
 
对于汉字,ZHS16GBK编码一个汉字需要2个字节,UTF8需要3个字节。
 
SQL> select dump('多多',1010) from dual;


DUMP('多多',1010)
-------------------------------------------------------
Typ=96 Len=6 CharacterSet=UTF8: 229,164,154,229,164,154
 
SQL> select dump('多多',1010) from dual;


DUMP('多多',1010)
---------------------------------------------------
Typ=96 Len=4 CharacterSet=ZHS16GBK: 182,224,182,224
 
 
3、Value
 
具体的存储值。返回的数值就是Oracle在自己内部对前面的这个expr值得存储形式。对于非汉字的普通字符串,可以理解为就是它的ASCII码。举例证明:
 
SYS@ tsid > select dump('a=?5') from dual;
 
DUMP('A=?5')
-------------------------
Typ=96 Len=4: 97,61,63,53
 
SYS@ tsid > select chr(97),chr(61),chr(63),chr(53) from dual;
 
C C C C
- - - -
a = ? 5
 
SYS@ tsid > select ascii('a'),ascii('='),ascii('?'),ascii('5') from dual;
 
ASCII('A') ASCII('=') ASCII('?') ASCII('5')
---------- ---------- ---------- ----------
       97        61        63        53
 
ASCII码表:
ASCII值
控制字符
ASCII值
控制字符
ASCII值
控制字符
ASCII值
控制字符
0
NUT
32
(space)
64
@
96

1
SOH
33

65
A
97
a
2
STX
34

66
B
98
b
3
ETX
35
#
67
C
99
c
4
EOT
36
$
68
D
100
d
5
ENQ
37
%
69
E
101
e
6
ACK
38
&
70
F
102
f
7
BEL
39
,
71
G
103
g
8
BS
40
(
72
H
104
h
9
HT
41
)
73
I
105
i
10
LF
42
*
74
J
106
j
11
VT
43
+
75
K
107
k
12
FF
44
,
76
L
108
l
13
CR
45
-
77
M
109
m
14
SO
46
.
78
N
110
n
15
SI
47
/
79
O
111
o
16
DLE
48
0
80
P
112
p
17
DCI
49
1
81
Q
113
q
18
DC2
50
2
82
R
114
r
19
DC3
51
3
83
X
115
s
20
DC4
52
4
84
T
116
t
21
NAK
53
5
85
U
117
u
22
SYN
54
6
86
V
118
v
23
TB
55
7
87
W
119
w
24
CAN
56
8
88
X
120
x
25
EM
57
9
89
Y
121
y
26
SUB
58
:
90
Z
122
z
27
ESC
59
;
91
[
123
{
28
FS
60
<
92
/
124
|
29
GS
61
=
93
]
125
}
30
RS
62
>
94
^
126
~
31
US
63
?
95

127
DEL
 
对于数字的存储,不像字符那么简单,而是应用Oracle自己的一个算法。

DUMP函数的输出格式类似:

  类型 <[长度]>,符号/指数位 [数字1,数字2,数字3,......,数字20]
  各位的含义如下:
  1.类型: Number型,Type=2 (类型代码可以从Oracle的文档上查到)
  2.长度:指存储的字节数
  3.符号/指数位
  在存储上,Oracle对正数和负数分别进行存储转换:
  正数:加1存储(为了避免Null)
  负数:被101减,如果总长度小于21个字节,最后加一个102(是为了排序的需要)
  指数位换算:
  正数:指数=符号/指数位 - 193 (最高位为1是代表正数)
  负数:指数=62 - 第一字节
  4.从<数字1>开始是有效的数据位
  从<数字1>开始是最高有效位,所存储的数值计算方法为:
  将下面计算的结果加起来:
  每个<数字位>乘以100^(指数-N) (N是有效位数的顺序位,第一个有效位的N=0)
  5、举例说明
  SQL> select dump(123456.789) from dual;
  DUMP(123456.789)-------------------------------Typ=2 Len=6: 195,13,35,57,79,91
  <指数>:     195 - 193 = 2
  <数字1>      13 - 1      = 12 *100^(2-0) 120000
  <数字2>      35 - 1      = 34 *100^(2-1) 3400
  <数字3>      57 - 1      = 56 *100^(2-2) 56
  <数字4>      79 - 1      = 78 *100^(2-3) .78
  <数字5>      91 - 1      = 90 *100^(2-4) .009
  123456.789
  SQL> select dump(-123456.789) from dual;
  DUMP(-123456.789)----------------------------------Typ=2 Len=7: 60,89,67,45,23,11,102
  <指数>       62 - 60 = 2(最高位是0,代表为负数)
  <数字1> 101 - 89 = 12 *100^(2-0) 120000
  <数字2> 101 - 67 = 34 *100^(2-1) 3400
  <数字3> 101 - 45 = 56 *100^(2-2) 56
  <数字4> 101 - 23 = 78 *100^(2-3) .78
  <数字5> 101 - 11 = 90 *100^(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<-123456.78901的情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值