LOW_VALUE、HIGH_VALUE、ENDPOINT_VALUE轉換--UTL_RAW、DBMS_STATS.CONVERT_RAW_VALUE

lhrbest發表於2017-06-06

LOW_VALUE、HIGH_VALUE、ENDPOINT_VALUE的轉換--UTL_RAW、HEXSTR、DBMS_STATS.CONVERT_RAW_VALUE的使用



直方圖ENDPOINT_VALUE轉換:

首先準備基礎表:
CREATE TABLE T_ST_20170605_LHR(ID NUMBER,STR VARCHAR2(30));
INSERT INTO T_ST_20170605_LHR SELECT ROWNUM ID,1 STR FROM DUAL CONNECT BY LEVEL<=10001;
UPDATE T_ST_20170605_LHR T SET T.STR=6 WHERE T.ID=10001;
EXEC DBMS_STATS.GATHER_TABLE_STATS(USER,'T_ST_20170605_LHR',CASCADE=>TRUE,METHOD_OPT=>'FOR COLUMNS STR SIZE 2');
檢視直方圖資訊:
LHR@orclasm > COL COLUMN_NAME FORMAT A15
LHR@orclasm > SELECT D.COLUMN_NAME,D.NUM_DISTINCT,D.NUM_NULLS,D.NUM_BUCKETS,D.HISTOGRAM FROM DBA_TAB_COL_STATISTICS D WHERE D.TABLE_NAME = 'T_ST_20170605_LHR';


COLUMN_NAME     NUM_DISTINCT  NUM_NULLS NUM_BUCKETS HISTOGRAM
--------------- ------------ ---------- ----------- ---------------
STR                        2          0           2 FREQUENCY
LHR@orclasm > SELECT TABLE_NAME,COLUMN_NAME,ENDPOINT_VALUE,ENDPOINT_NUMBER FROM DBA_TAB_HISTOGRAMS WHERE TABLE_NAME='T_ST_20170605_LHR';


TABLE_NAME                     COLUMN_NAME     ENDPOINT_VALUE ENDPOINT_NUMBER
------------------------------ --------------- -------------- ---------------
T_ST_20170605_LHR              STR                 2.5442E+35           10000
T_ST_20170605_LHR              STR                 2.8038E+35           10001
這裡的ENDPOINT_VALUE值需要去轉換,字元‘1’的16進位制的dump值為0x31,字元‘6’的16進位制的dump值為0x36,
LHR@orclasm > SELECT DUMP('1',16),DUMP('6',16) FROM DUAL; 


DUMP('1',16)     DUMP('6',16)
---------------- ----------------
Typ=96 Len=1: 31 Typ=96 Len=1: 36
將0x31右邊補0一直補到15個位元組(共30位),再將其轉換為10進位制數,0x36類似,如下所示:
LHR@orclasm > SELECT TO_NUMBER('310000000000000000000000000000','XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX') C1,TO_NUMBER('360000000000000000000000000000','XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX') C2 FROM DUAL; 


        C1         C2
---------- ----------
2.5442E+35 2.8038E+35
可以看到轉換後的結果和之前查詢出來的結果一致。為了方便轉換給出如下函式:
CREATE OR REPLACE FUNCTION HEXSTR(P_NUMBER IN NUMBER) RETURN VARCHAR2 AS
  L_STR    LONG := TO_CHAR(P_NUMBER, 'fm' || RPAD('x', 50, 'x'));
  L_RETURN VARCHAR2(4000);
BEGIN
  WHILE (L_STR IS NOT NULL) LOOP
    L_RETURN := L_RETURN || CHR(TO_NUMBER(SUBSTR(L_STR, 1, 2), 'xx'));
    L_STR    := SUBSTR(L_STR, 3);
  END LOOP;


  RETURN(SUBSTR(L_RETURN, 1, 6));
END;
再次查詢:
LHR@orclasm > COL ENDPOINT_VALUE2 FORMAT A15
LHR@orclasm > SELECT TABLE_NAME,COLUMN_NAME,ENDPOINT_VALUE,ENDPOINT_NUMBER,HEXSTR(ENDPOINT_VALUE) ENDPOINT_VALUE2 FROM DBA_TAB_HISTOGRAMS WHERE TABLE_NAME='T_ST_20170605_LHR';


TABLE_NAME                     COLUMN_NAME     ENDPOINT_VALUE ENDPOINT_NUMBER ENDPOINT_VALUE2
------------------------------ --------------- -------------- --------------- ---------------
T_ST_20170605_LHR              STR                 2.5442E+35           10000 1
T_ST_20170605_LHR              STR                 2.8038E+35           10001 6





列統計資訊LOW_VALUE、HIGH_VALUE的轉換:

使用DBMS_STATS.CONVERT_RAW_VALUE或UTL_RAW.CAST_TO_NUMBER、UTL_RAW.CAST_TO_VARCHAR2等。

點選(此處)摺疊或開啟

  1. CREATE OR REPLACE FUNCTION FUN_DISPLAY_RAW_LHR(P_RAWVAL RAW,
  2.                                                P_TYPE VARCHAR2)
  3.   RETURN VARCHAR2 IS
  4.   V_NUMBER NUMBER;
  5.   V_VARCHAR2 VARCHAR2(32);
  6.   V_DATE DATE;
  7.   V_NVARCHAR2 NVARCHAR2(32);
  8.   V_ROWID ROWID;
  9.   V_CHAR CHAR(32);
  10. BEGIN
  11.   IF (P_TYPE = 'NUMBER' OR P_TYPE = 'FLOAT') THEN
  12.     DBMS_STATS.CONVERT_RAW_VALUE(P_RAWVAL, V_NUMBER);
  13.     RETURN TO_CHAR(V_NUMBER);
  14.   ELSIF (P_TYPE = 'VARCHAR2') THEN
  15.     DBMS_STATS.CONVERT_RAW_VALUE(P_RAWVAL, V_VARCHAR2);
  16.     RETURN TO_CHAR(V_VARCHAR2);
  17.   ELSIF (P_TYPE = 'DATE' OR P_TYPE LIKE 'TIMESTAMP%') THEN
  18.     DBMS_STATS.CONVERT_RAW_VALUE(P_RAWVAL, V_DATE);
  19.     RETURN TO_CHAR(V_DATE);
  20.   ELSIF (P_TYPE = 'NVARCHAR2') THEN
  21.     DBMS_STATS.CONVERT_RAW_VALUE(P_RAWVAL, V_NVARCHAR2);
  22.     RETURN TO_CHAR(V_NVARCHAR2);
  23.   ELSIF (P_TYPE = 'ROWID') THEN
  24.     DBMS_STATS.CONVERT_RAW_VALUE(P_RAWVAL, V_ROWID);
  25.     RETURN TO_CHAR(V_ROWID);
  26.   ELSIF (P_TYPE = 'CHAR') THEN
  27.     DBMS_STATS.CONVERT_RAW_VALUE(P_RAWVAL, V_CHAR);
  28.     RETURN TO_CHAR(V_CHAR);
  29.   ELSIF (P_TYPE = 'RAW') THEN
  30.     RETURN TO_CHAR(P_RAWVAL);
  31.   ELSE
  32.     RETURN 'UNKNOWN DATATYPE!';
  33.   END IF;
  34. EXCEPTION
  35.   WHEN OTHERS THEN
  36.     RETURN 'ERRORS!';
  37. END FUN_DISPLAY_RAW_LHR;



點選(此處)摺疊或開啟

  1. SELECT D.COLUMN_NAME,
  2.        D.LOW_VALUE,
  3.        D.HIGH_VALUE,
  4.        D.DENSITY,
  5.        D.NUM_DISTINCT,
  6.        D.NUM_NULLS,
  7.        D.NUM_BUCKETS,
  8.        D.HISTOGRAM,
  9.        D.DATA_TYPE,
  10.        FUN_DISPLAY_RAW_LHR(D.LOW_VALUE, D.DATA_TYPE) LOW_VALUE1,
  11.        FUN_DISPLAY_RAW_LHR(D.HIGH_VALUE, D.DATA_TYPE) HIGH_VALUE1--,
  12.        --UTL_RAW.CAST_TO_NUMBER(D.LOW_VALUE) LOW_VALUE2,
  13.        --UTL_RAW.CAST_TO_NUMBER(D.HIGH_VALUE) HIGH_VALUE2,
  14.   FROM USER_TAB_COLS D
  15.  WHERE D.TABLE_NAME = 'T_AA_20170606_LHR';











ORACLE VERSION 11.2.0.4

下面是utl_raw包下的所有函式
  1. SQL>desc utl_raw

  2. FUNCTION BIT_AND RETURNS RAW
  3.  Argument Name Type In/Out Default?
  4.  ------------------------------ ----------------------- ------ --------
  5.  R1 RAW IN
  6.  R2 RAW IN

  7. FUNCTION BIT_COMPLEMENT RETURNS RAW
  8.  Argument Name Type In/Out Default?
  9.  ------------------------------ ----------------------- ------ --------
  10.  R RAW IN

  11. FUNCTION BIT_OR RETURNS RAW
  12.  Argument Name Type In/Out Default?
  13.  ------------------------------ ----------------------- ------ --------
  14.  R1 RAW IN
  15.  R2 RAW IN

  16. FUNCTION BIT_XOR RETURNS RAW
  17.  Argument Name Type In/Out Default?
  18.  ------------------------------ ----------------------- ------ --------
  19.  R1 RAW IN
  20.  R2 RAW IN

  21. FUNCTION CAST_FROM_BINARY_DOUBLE RETURNS RAW
  22.  Argument Name Type In/Out Default?
  23.  ------------------------------ ----------------------- ------ --------
  24.  N BINARY_DOUBLE IN
  25.  ENDIANESS BINARY_INTEGER IN DEFAULT

  26. FUNCTION CAST_FROM_BINARY_FLOAT RETURNS RAW
  27.  Argument Name Type In/Out Default?
  28.  ------------------------------ ----------------------- ------ --------
  29.  N BINARY_FLOAT IN
  30.  ENDIANESS BINARY_INTEGER IN DEFAULT

  31. FUNCTION CAST_FROM_BINARY_INTEGER RETURNS RAW
  32.  Argument Name Type In/Out Default?
  33.  ------------------------------ ----------------------- ------ --------
  34.  N BINARY_INTEGER IN
  35.  ENDIANESS BINARY_INTEGER IN DEFAULT

  36. FUNCTION CAST_FROM_NUMBER RETURNS RAW
  37.  Argument Name Type In/Out Default?
  38.  ------------------------------ ----------------------- ------ --------
  39.  N NUMBER IN

  40. FUNCTION CAST_TO_BINARY_DOUBLE RETURNS BINARY_DOUBLE
  41.  Argument Name Type In/Out Default?
  42.  ------------------------------ ----------------------- ------ --------
  43.  R RAW IN
  44.  ENDIANESS BINARY_INTEGER IN DEFAULT

  45. FUNCTION CAST_TO_BINARY_FLOAT RETURNS BINARY_FLOAT
  46.  Argument Name Type In/Out Default?
  47.  ------------------------------ ----------------------- ------ --------
  48.  R RAW IN
  49.  ENDIANESS BINARY_INTEGER IN DEFAULT

  50. FUNCTION CAST_TO_BINARY_INTEGER RETURNS BINARY_INTEGER
  51.  Argument Name Type In/Out Default?
  52.  ------------------------------ ----------------------- ------ --------
  53.  R RAW IN
  54.  ENDIANESS BINARY_INTEGER IN DEFAULT

  55. FUNCTION CAST_TO_NUMBER RETURNS NUMBER
  56.  Argument Name Type In/Out Default?
  57.  ------------------------------ ----------------------- ------ --------
  58.  R RAW IN
  59. FUNCTION CAST_TO_NVARCHAR2 RETURNS NVARCHAR2
  60.  Argument Name Type In/Out Default?
  61.  ------------------------------ ----------------------- ------ --------
  62.  R RAW IN

  63. FUNCTION CAST_TO_RAW RETURNS RAW
  64.  Argument Name Type In/Out Default?
  65.  ------------------------------ ----------------------- ------ --------
  66.  C VARCHAR2 IN

  67. FUNCTION CAST_TO_VARCHAR2 RETURNS VARCHAR2
  68.  Argument Name Type In/Out Default?
  69.  ------------------------------ ----------------------- ------ --------
  70.  R RAW IN
  71. FUNCTION COMPARE RETURNS NUMBER
  72.  Argument Name Type In/Out Default?
  73.  ------------------------------ ----------------------- ------ --------
  74.  R1 RAW IN
  75.  R2 RAW IN
  76.  PAD RAW IN DEFAULT

  77. FUNCTION CONCAT RETURNS RAW
  78.  Argument Name Type In/Out Default?
  79.  ------------------------------ ----------------------- ------ --------
  80.  R1 RAW IN DEFAULT
  81.  R2 RAW IN DEFAULT
  82.  R3 RAW IN DEFAULT
  83.  R4 RAW IN DEFAULT
  84.  R5 RAW IN DEFAULT
  85.  R6 RAW IN DEFAULT
  86.  R7 RAW IN DEFAULT
  87.  R8 RAW IN DEFAULT
  88.  R9 RAW IN DEFAULT
  89.  R10 RAW IN DEFAULT
  90.  R11 RAW IN DEFAULT
  91.  R12 RAW IN DEFAULT

  92. FUNCTION CONVERT RETURNS RAW
  93.  Argument Name Type In/Out Default?
  94.  ------------------------------ ----------------------- ------ --------
  95.  R RAW IN
  96.  TO_CHARSET VARCHAR2 IN
  97.  FROM_CHARSET VARCHAR2 IN

  98. FUNCTION COPIES RETURNS RAW
  99.  Argument Name Type In/Out Default?
  100.  ------------------------------ ----------------------- ------ --------
  101.  R RAW IN
  102.  N NUMBER IN
  103. FUNCTION LENGTH RETURNS NUMBER
  104.  Argument Name Type In/Out Default?
  105.  ------------------------------ ----------------------- ------ --------
  106.  R RAW IN

  107. FUNCTION OVERLAY RETURNS RAW
  108.  Argument Name Type In/Out Default?
  109.  ------------------------------ ----------------------- ------ --------
  110.  OVERLAY_STR RAW IN
  111.  TARGET RAW IN
  112.  POS BINARY_INTEGER IN DEFAULT
  113.  LEN BINARY_INTEGER IN DEFAULT
  114.  PAD RAW IN DEFAULT
  115. FUNCTION REVERSE RETURNS RAW
  116.  Argument Name Type In/Out Default?
  117.  ------------------------------ ----------------------- ------ --------
  118.  R RAW IN

  119. FUNCTION SUBSTR RETURNS RAW
  120.  Argument Name Type In/Out Default?
  121.  ------------------------------ ----------------------- ------ --------
  122.  R RAW IN
  123.  POS BINARY_INTEGER IN
  124.  LEN BINARY_INTEGER IN DEFAULT
  125. FUNCTION TRANSLATE RETURNS RAW
  126.  Argument Name Type In/Out Default?
  127.  ------------------------------ ----------------------- ------ --------
  128.  R RAW IN
  129.  FROM_SET RAW IN
  130.  TO_SET RAW IN

  131. FUNCTION TRANSLITERATE RETURNS RAW
  132.  Argument Name Type In/Out Default?
  133.  ------------------------------ ----------------------- ------ --------
  134.  R RAW IN
  135.  TO_SET RAW IN DEFAULT
  136.  FROM_SET RAW IN DEFAULT
  137.  PAD RAW IN DEFAULT

  138. FUNCTION XRANGE RETURNS RAW
  139.  Argument Name Type In/Out Default?
  140.  ------------------------------ ----------------------- ------ --------
  141.  START_BYTE RAW IN DEFAULT
  142.  END_BYTE RAW IN DEFAULT

DBMS_STATS.CONVERT_RAW_VALUE函式
  1. SQL> desc dbms_stats
  2. PROCEDURE CONVERT_RAW_VALUE
  3.  Argument Name Type In/Out Default?
  4.  ------------------------------ ----------------------- ------ --------
  5.  RAWVAL RAW IN
  6.  RESVAL VARCHAR2 OUT

  7. PROCEDURE CONVERT_RAW_VALUE
  8.  Argument Name Type In/Out Default?
  9.  ------------------------------ ----------------------- ------ --------
  10.  RAWVAL RAW IN
  11.  RESVAL DATE OUT

  12. PROCEDURE CONVERT_RAW_VALUE
  13.  Argument Name Type In/Out Default?
  14.  ------------------------------ ----------------------- ------ --------
  15.  RAWVAL RAW IN

  16.  RESVAL NUMBER OUT
  17. PROCEDURE CONVERT_RAW_VALUE
  18.  Argument Name Type In/Out Default?
  19.  ------------------------------ ----------------------- ------ --------
  20.  RAWVAL RAW IN
  21.  RESVAL BINARY_FLOAT OUT

  22. PROCEDURE CONVERT_RAW_VALUE
  23.  Argument Name Type In/Out Default?
  24.  ------------------------------ ----------------------- ------ --------
  25.  RAWVAL RAW IN
  26.  RESVAL BINARY_DOUBLE OUT

utl_raw、CONVERT_RAW_VALUE使用在 字元數值比對、統計資訊等指標數值轉換上。 

下面是簡單實驗。

  1. --TABLE存在4個不同型別的欄位
  2. SQL> DESC TABLE
  3.  Name                      Null?     Type
  4.  ------------------------- -------- ----------------------------
  5.  DIS_NUMBER                NOT NULL NUMBER(12)
  6.  RSVDC3                             VARCHAR2(16)
  7.  ORDER_PV                           NUMBER(12,2)
  8.  SALE_DATE                          DATE

  9. --統計資訊收集後,列的統計資訊如下。SQL執行計劃與索引的使用,會參考統計資訊獲得的值。
  10. --現在我們主要關注LOW_VALUE,HIGH_VALUE欄位的值。
  11. COLUMN_NAME    LOW_VALUE          HIGH_VALUE 
  12. -------------- ------------------ ------------------------ 
  13. DIS_NUMBER     C102               C60A6464646464 
  14. RSVDC3         3C6241395166       C40A4D4323
  15. ORDER_PV       3D582C5166         C4400707450B
  16. SALE_DATE      786D0305010101     78C70C04010101


使用utl_raw.CAST_TO_NUMBER函式獲取DIS_NUMBER欄位,LOW_VALUE與HIGH_VALUE的值。

  1. SQL> select utl_raw.CAST_TO_NUMBER('C102') low_num,utl_raw.CAST_TO_NUMBER('C60A6464646464') high_num from dual

  2.    LOW_NUM HIGH_NUM
  3. ---------- ----------------------
  4.          1 99999999999
  5.   
  6. --同樣,可以使用utl_raw.CAST_FROM_NUMBER函式轉換成資料庫的raw格式。
  7.   
  8. SQL>select utl_raw.CAST_FROM_NUMBER(1) LOW_VALUE,utl_raw.CAST_FROM_NUMBER(99999999999) HIGH_VALUE from dual
  9.   
  10.          LOW_VALUE  HIGH_VALUE
  11. ------------------ ------------------------
  12.              C102   C60A6464646464

同理,VARCHAR型別的值,也可使用utl_raw.CAST_TO_VARCHAR2 

DATE型別使用dbms_stats.convert_raw_value()函式。
  1. DECLARE
     rv RAW(32) := '786D0305010101';
     dt DATE := NULL;
    BEGIN
      dbms_stats.convert_raw_value(rv, dt);
      dbms_output.put_line('LOW_DATE: '||TO_CHAR(dt, 'YYYY-MM-DD hh24:mi:ss'));
    END;
    /

  2. LOW_DATE: 2009-03-05 00:00:00

下面自定義函式,利用dbms_stats.convert_raw_value函式,可快速獲得不同型別的真實值。

  1. CREATE OR REPLACE FUNCTION FUN_DISPLAY_RAW_LHR(P_RAWVAL RAW,
                                                   P_TYPE   VARCHAR2)
      RETURN VARCHAR2 IS
      V_NUMBER    NUMBER;
      V_VARCHAR2  VARCHAR2(32);
      V_DATE      DATE;
      V_NVARCHAR2 NVARCHAR2(32);
      V_ROWID     ROWID;
      V_CHAR      CHAR(32);
    BEGIN
      IF (P_TYPE = 'NUMBER' OR P_TYPE = 'FLOAT') THEN
        DBMS_STATS.CONVERT_RAW_VALUE(P_RAWVAL, V_NUMBER);
        RETURN TO_CHAR(V_NUMBER);
      ELSIF (P_TYPE = 'VARCHAR2') THEN
        DBMS_STATS.CONVERT_RAW_VALUE(P_RAWVAL, V_VARCHAR2);
        RETURN TO_CHAR(V_VARCHAR2);
      ELSIF (P_TYPE = 'DATE' OR P_TYPE LIKE 'TIMESTAMP%') THEN
        DBMS_STATS.CONVERT_RAW_VALUE(P_RAWVAL, V_DATE);
        RETURN TO_CHAR(V_DATE);
      ELSIF (P_TYPE = 'NVARCHAR2') THEN
        DBMS_STATS.CONVERT_RAW_VALUE(P_RAWVAL, V_NVARCHAR2);
        RETURN TO_CHAR(V_NVARCHAR2);
      ELSIF (P_TYPE = 'ROWID') THEN
        DBMS_STATS.CONVERT_RAW_VALUE(P_RAWVAL, V_ROWID);
        RETURN TO_CHAR(V_ROWID);
      ELSIF (P_TYPE = 'CHAR') THEN
        DBMS_STATS.CONVERT_RAW_VALUE(P_RAWVAL, V_CHAR);
        RETURN TO_CHAR(V_CHAR);
      ELSIF (P_TYPE = 'RAW') THEN
        RETURN TO_CHAR(P_RAWVAL);
      ELSE
        RETURN 'UNKNOWN DATATYPE!';
      END IF;
    EXCEPTION
      WHEN OTHERS THEN
        RETURN 'ERRORS!';
    END FUN_DISPLAY_RAW_LHR;

    SELECT D.TABLE_NAME, D.COLUMN_NAME, 
           D.LOW_VALUE,
           D.HIGH_VALUE,
           D.DENSITY,
           D.NUM_DISTINCT,
           D.NUM_NULLS,
           D.NUM_BUCKETS,
           D.HISTOGRAM,
           D.DATA_TYPE,
           FUN_DISPLAY_RAW_LHR(D.LOW_VALUE, D.DATA_TYPE) LOW_VALUE1,
           FUN_DISPLAY_RAW_LHR(D.HIGH_VALUE, D.DATA_TYPE) LOW_VALUE2
      FROM USER_TAB_COLS D
     WHERE D.LOW_VALUE IS NOT NULL 
     AND D.TABLE_NAME='T_ROWS_20170605_LHR'
     AND ROWNUM<=10;


  2. COLUMN_NAME                    PARTITION_NAME     NUM_DISTINCT LOW_VALUE          HIGH_VALUE               DATA_TYPE
    ------------------------------ ------------------ ------------ ------------------ ------------------------ ----------------
    ALLOCATION_DIST_NUMBER         P_MOH_2012_10              4964 6737               9999520                  NUMBER
    ALLOCATION_DIST_NUMBER         P_MOH_2012_11              4989 6737               9999956                  NUMBER
    ALLOCATION_DIST_NUMBER         P_MOH_2012_12              5351 6737               9999936                  NUMBER
    ALLOCATION_DIST_NUMBER         P_MOH_2012_6                 12 7007633            9961247                  NUMBER
    ALLOCATION_DIST_NUMBER         P_MOH_2012_7                380 7000028            9996912                  NUMBER
    CURRENCY_CODE                  P_MOH_2014_4                  3 HKD                RMB                      VARCHAR2
    CURRENCY_CODE                  P_MOH_2014_5                  3 HKD                RMB                      VARCHAR2
    CURRENCY_CODE                  P_MOH_2014_6                  3 HKD                RMB                      VARCHAR2
    CURRENCY_CODE                  P_MOH_2014_7                  3 HKD                RMB                      VARCHAR2
    INVOICE_SALES_DATE             P_MOH_2014_10                78 06-SEP-14          23-JAN-15                DATE
    INVOICE_SALES_DATE             P_MOH_2014_11                77 14-OCT-14          26-JAN-15                DATE
    INVOICE_SALES_DATE             P_MOH_2014_12                75 10-NOV-14          01-FEB-15                DATE
    INVOICE_SALES_DATE             P_MOH_2014_2                 40 12-FEB-14          29-MAR-14                DATE
    INVOICE_SALES_DATE             P_MOH_2014_3                 81 01-MAR-14          30-APR-14                DATE


還原DUMP出來的數字
SQL> select dump(2000,16) from dual;

DUMP(2000,16)
------------------
Typ=2 Len=2: c2,15


SQL> declare n number;
  2  begin
  3   dbms_stats.convert_raw_value('c215',n);
  4  dbms_output.put_line(n);
  5  end;
  6  /
2000


declare n number;
     begin
     dbms_stats.convert_raw_value('c215',n);
     dbms_output.put_line(n);
     end;
   /
還原DUMP的字串

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

DUMP('ROBINSON',16)
-------------------------------------
Typ=96 Len=8: 72,6f,62,69,6e,73,6f,6e

SQL> declare n varchar2(2000);
  2       begin
  3       dbms_stats.convert_raw_value('726f62696e736f6e',n);
  4       dbms_output.put_line(n);
  5       end;
  6     /
robinson

SQL> select dump('robinson') from dual;

DUMP('ROBINSON')
--------------------------------------------
Typ=96 Len=8: 114,111,98,105,110,115,111,110

其實這個時候DUMP出來的是以10進位制顯示的,也就是說114相對於72,也就是r,後面的字幕同樣

SQL> select to_char(114,'xxx') from dual;

TO_C
----
  72

SQL> declare n varchar2(2000);
  2       begin
  3       dbms_stats.convert_raw_value('72',n);
  4       dbms_output.put_line(n);
  5       end;
  6     /
r







About Me

...............................................................................................................................

● 本文作者:小麥苗,只專注於資料庫的技術,更注重技術的運用

● 本文在itpub(http://blog.itpub.net/26736162)、部落格園(http://www.cnblogs.com/lhrbest)和個人微信公眾號(xiaomaimiaolhr)上有同步更新

● 本文itpub地址:http://blog.itpub.net/26736162/abstract/1/

● 本文部落格園地址:http://www.cnblogs.com/lhrbest

● 本文pdf版及小麥苗雲盤地址:http://blog.itpub.net/26736162/viewspace-1624453/

● 資料庫筆試面試題庫及解答:http://blog.itpub.net/26736162/viewspace-2134706/

● QQ群:230161599     微信群:私聊

● 聯絡我請加QQ好友(646634621),註明新增緣由

● 於 2017-06-02 09:00 ~ 2017-06-30 22:00 在魔都完成

● 文章內容來源於小麥苗的學習筆記,部分整理自網路,若有侵權或不當之處還請諒解

● 版權所有,歡迎分享本文,轉載請保留出處

...............................................................................................................................

拿起手機使用微信客戶端掃描下邊的左邊圖片來關注小麥苗的微信公眾號:xiaomaimiaolhr,掃描右邊的二維碼加入小麥苗的QQ群,學習最實用的資料庫技術。

LOW_VALUE、HIGH_VALUE、ENDPOINT_VALUE轉換--UTL_RAW、DBMS_STATS.CONVERT_RAW_VALUE
DBA筆試面試講解
歡迎與我聯絡

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26736162/viewspace-2140335/,如需轉載,請註明出處,否則將追究法律責任。

相關文章