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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章