Oracle函数 DUMP(随记)

参考
《Oracle dump函数》
《oracle dump详解》

语法

DUMP( expr [ ,return_fmt [,start_position] [,length] ] )

含义
  • expr:指要分析的表达式(数字或字符串等,可以是各个类型的值)

  • return_fmt:返回参数的格式,分为:
    1)8:以 8进制 返回结果值
    2)10:以 10进制 返回结果值 默认值
    3)16:以 16进制 返回结果值

    SQL> select dump(16,16) from dual;
    
    DUMP(16,16)
    ------------------------------------
    Typ=2 Len=2: c1,11
    #Typ=2: 表示number类型
    #Len=2:长度为2
    #c1:
    #	number类型正数的最高位是个位的话,则最高位表示位为C1
    #	参考《Oracle基本数据类型存储格式浅析(二)——数字类型》
    #11:=10+1    10(16)=16
    

    4)17:以 单字符 的形式返回结果值,否则字符以16进制数据返回。

    SQL> select dump('nahfnaSF vaKEgu525234',17) from dual;
    DUMP('NAHFNASFVAKEGU',17)
    --------------------------------------------------------------------------------
    Typ=96 Len=15: n,a,h,f,n,a,S,F, ,v,a,K,E,g,u
    

    5)1000return_fmt加上1000实现返回字符集信息。

    SQL> select dump('abc',1010) from dual;
    
    DUMP('ABC',1010)
    --------------------------------------------------------------------------------
    Typ=96 Len=3 CharacterSet=AL32UTF8: 97,98,99
    
  • start_position:开始进行返回的字符串位置

  • length:需要返回的字符串长度

返回值

类型 <[长度]>,符号/指数位 [数字1,数字2,数字3,…,数字20]

含义
  • 类型:例如Number型,Type=2 (类型代码可以从Oracle的文档上查到,见结尾)

  • 长度:指存储的字节数(对于汉字,ZHS16GBK编码一个汉字需要2个字节,UTF8需要3个字节。)

  • 符号/指数位
    1)具体的存储值;
    2)返回的数值就是Oracle在自己内部对expr值的存储形式;
    3)对于非汉字的普通字符串,可以理解为就是它的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
    

    在存储上,Oracle对正数和负数分别进行存储转换:

    1)正数:指数=符号/指数位 - 193 (第一字节);加1存储(为了避免Null),在实际算法中就是要减1,必须>128

    SQL> select dump(1) from dual;
    
    DUMP(1)
    ------------------------------------
    Typ=2 Len=2: 193,2
    

    2)负数:指数=62 - 第一字节;被101减,如果总长度小于21个字节,最后加一个102(是为了排序的需要),必须<128

    SQL> select dump(-1) from dual;
    
    DUMP(-1)
    ----------------------------------------------
    Typ=2 Len=3: 62,100,102
    
  • 从<数字1>开始是有效的数据位

  • 从<数字1>开始是最高有效位,所存储的数值计算方法为:

将下面计算的结果加起来:

每个<数字位>乘以100^(指数-N) (N是有效位数的顺序位,第一个有效位的N=0)

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(-)

补充关于 Typ=2 Len=2: c1,11 中关于c1的理解:

参考《Oracle基本数据类型存储格式浅析(二)——数字类型》
在这里插入图片描述

关于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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值