ITPub博客

首页 > 数据库 > Oracle > 初始ORACLE DUMP 函数

初始ORACLE DUMP 函数

Oracle 作者:Eurca 时间:2014-08-01 10:18:36 0 删除 编辑

DUMP函数返回一个Varchar2的值,该值格式如下

Type=××× Len=×××: ×××(,×××)*

 

Type可以参阅

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

Len 字节数

参数说明:

return_fmt

8  返回8进制结果

10 返回10进制结果

16返回16进制结果

17以每个字节作为单个字符返回,当且仅当它可以被解释为编译器的字符集中的可打印字符-------通常是ASCII or EBCDIC。

 

start_position and length

确定要返回的内部表示形式的哪个部分。

expr 为 null,则此函数返回 NULL。

该函数不支持CLOB直接作为参数。但是,可以作为通过隐式数据转换参数中传递 CLOB值。

 

例子如下:

SQL> select dump(1,16) from dual;

DUMP(1,16)

-----------------

Typ=2 Len=2: c1,2

 

SQL> select dump(1,10) from dual;

DUMP(1,10)

------------------

Typ=2 Len=2: 193,2

 

SQL> select dump('火狐',16) from dual;

DUMP('火狐',16)

-------------------------

Typ=96 Len=4: bb,f0,ba,fc

 

SQL> select dump('US',16) from dual;

DUMP('US',16)

-------------------

Typ=96 Len=2: 55,53

 

SQL> select dump('US',17) from dual;

DUMP('US',17)

-----------------

Typ=96 Len=2: U,S

 

SQL> select dump('火狐',17) from dual;

DUMP('火狐',17)

-------------------------

Typ=96 Len=4: bb,f0,ba,fc

 

SQL> select dump(1,17) from dual;

DUMP(1,17)

------------------

Typ=2 Len=2: c1,^B

 

SQL> select dump('火狐',17,1,1) from dual;

DUMP('火狐',17,1

----------------

Typ=96 Len=4: bb

 

SQL> select dump('火狐',17,1,2) from dual;

DUMP('火狐',17,1,2)

-------------------

Typ=96 Len=4: bb,f0

 

 

其次,了解一下Number类型数据在DUMP是如何处理的。

Number型数据经DUMP函数处理以后,输出格式如下:

Type=2 Len=×××:符号/指数位,  [数字1,数字2,数字3,. . . ,数字20]

Type=2 :表示Number类型

注意:如果是负数,且总长度小于21个字节,最后加一个102(是为了排序的需要)

 

 

DUMP(number,10)是以指数的方式处理的

正数: 符号/指数位 > 128

         计算公式:

                   指数=符号/指数位(第一字节)-193, 设 N为指数

                   数值1 = (数字1-1)*100^(N-0)

                   数值2 = (数字2-1)*100^(N-1)

                   .

                   .

.

数值20 = (数字20-1)*100^(N-19)

-------------------------------------------------------------

     Number数值  sum(数值1,数值2,数值3,. . . , 数值20)

 

负数:符号/指数位 < 128

指数=62-符号/指数位(第一字节),设 N为指数

                   数值1 = (101-数字1)*100^(N-0)

                   数值2 = (101-数字2)*100^(N-1)

                   .

                   .

.

数值20 = (101-数字20)*100^(N-19)

-------------------------------------------------------------

     Number数值  sum(数值1,数值2,数值3,. . . , 数值20)

 

0是区分正数和负数的分割点,0既不属于正数也不属于负数

 

0的以10进制方式DUMP出来的信息如下:

SQL> select dump(0) from dual;

DUMP(0)

----------------

Typ=2 Len=1: 128

根据上面的信息,我们可以计算得到16进制的DUMP信息应该是0X80,转换成二进制为1000 0000,正好是是一个字节编码最大值的一半。

 

以根据上面正数和负数的公式,我们计算以下数值的10和16进制的DUMP信息:

1)、150   2)、34.33   3)、-140  4)、 -333.99

 

第1)解题步骤:

150=100+50=100^1+ 50 ,

 

故根据上述,应该可以初步确认,150 DUMP函数输出格式:

Type=2 Len=3: 符号/指数位(第一字节),数字1,数字2

 

指数=符号/指数位(第一字节)-193 ,符号/指数位(第一字节)=194

100 ^1=(数字1-1)*100^(1-0)=(数字1-1)*100

数字1-1=1   ===>  数字1 = 2

 

50=(数字2-1)*100^(1-1)= (数字2-1)*1

数字2-1=50  ===>  数字2 = 51

 

150的DUMP函数10进制输出为: Type=2 Len=3: 194, 2, 51

根据上面,10进制194, 2, 51转换为16进制,则DUMP函数16进制为:

Type=2 Len=3: C2, 2, 33

 

Oracle SQL确认:

SQL> select dump(150) from dual;

DUMP(150)

---------------------

Typ=2 Len=3: 194,2,51

 

SQL> select dump(150,16) from dual;

DUMP(150,16)

--------------------

Typ=2 Len=3: c2,2,33

 

SQL>

 

第2)解题步骤:

33.33=33+0.33= (数字1-1)*100^(N-0)+ (数字2-1)*100^(N-1)

可以初步确认,33.33 DUMP函数输出格式:

Type=2 Len=3: 符号/指数位(第一字节),数字1,数字2

 

33 < 100   ===>  33 < 100^1    ===>  N = 0

符号/指数位(第一字节)= 193

    (数字1-1)*100^0=33   ===>  数字1=34

         (数字2-1)*100^(0-1)=0.33   ===>  数字2-1 = 33   ===>   数字2=34

33.33的DUMP函数10进制输出为: Type=2 Len=3: 193, 34, 34

                   16进制输出格式:Type=2 Len=3: C1, 22, 22

 

                   Oracle SQL确认:

         SQL> select dump(33.33,16) from dual;

DUMP(33.33,16)

---------------------

Typ=2 Len=3: c1,22,22

 

SQL> select dump(33.33) from dual;

 

DUMP(33.33)

----------------------

Typ=2 Len=3: 193,34,34

        

         第3题忽略不做……

        

第4)解题步骤:

         -333.99=-(300+33+0.99)=-(3*100^1+33+0.99)

         是负数

可以初步确认,-333.99 DUMP函数输出格式:

Type=2 Len=5: 符号/指数位(第一字节),数字1,数字2,数字3 , 120

 

         指数=62-符号/指数位(第一字节), 数字1上的指数是1 ,N=1

         故 1=62-符号/指数位(第一字节)  ===>  符号/指数位(第一字节)=61

 

         3*100^1 = (101-数字1)*100^(N-0)= (101-数字1)*100^1  ===>  3 = (101-数字1)

         数字1=98

    33=(101-数字2)*100^(1-1)  ===>  33= (101-数字2)

         数字2=68

         0.99==(101-数字3)*100^(1-2)  ===>  0.99= (101-数字3)*100^-1

    数字3 = 2

-333.99的DUMP函数10进制输出为: Type=2 Len=5: 61, 98, 68, 2,102

         16进制输出格式:Type=2 Len=5: 3D, 62, 44,2,66

 

Oracle SQL确认:

SQL> select dump(-333.99) from dual;

DUMP(-333.99)

---------------------------

Typ=2 Len=5: 61,98,68,2,102

 

SQL> select dump(-333.99,16) from dual;

DUMP(-333.99,16)

--------------------------

Typ=2 Len=5: 3d,62,44,2,66

http://www.cnblogs.com/Spiritual-journey/archive/2012/02/12/2348025.html
http://www.eygle.com/archives/2005/12/how_oracle_stor.html

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29665458/viewspace-1243547/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2014-05-19

  • 博文量
    22
  • 访问量
    53231