SYS_OP_MAP_NONNULL操作

yangtingkun發表於2010-08-05

無意在資料庫中發現了這個操作SYS_OP_MAP_NONNULL

 

 

SYS_OP_MAP_NONNULL應該不是資料庫中的物件,因為在DBA_OBJECTS中根本找不到它,而在STANDARDDBMS_STANDARD包中也找不到函式說明。

SQL> SELECT *
  2  FROM DBA_OBJECTS
  3  WHERE OBJECT_NAME = 'SYS_OP_MAP_NONNULL';

未選定行

SQL> SELECT *
  2  FROM DBA_SOURCE
  3  WHERE UPPER(TEXT) LIKE '%SYS_OP_MAP_NONNULL%';

未選定行

SYS_OP_MAP_NONNULL又可以跟引數,它不符合偽列的特性,因此暫且認為這是一個操作。不過文件中並沒有這個操作的任何相關記錄。

其實這個操作實現的就是DUMP函式的功能:

SQL> SELECT SYS_OP_MAP_NONNULL(5) FROM DUAL;

SYS_OP
------
C10600

SQL> SELECT SYS_OP_MAP_NONNULL('A') FROM DUAL;

SYS_
----
4100

SQL> SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS'), SYS_OP_MAP_NONNULL(SYSDATE) FROM DUAL;

TO_CHAR(SYSDATE,'YY SYS_OP_MAP_NONNU
------------------- ----------------
2010-08-06 02:19:47 786E080603143000

SQL> SELECT SYS_OP_MAP_NONNULL(NULL) FROM DUAL;

SY
--
FF

DUMP的區別在於NULL的處理上,DUMP的引數如果是NULL,返回結果也是NULL,而SYS_OP_MAP_NONNULL返回的是FF,而這正是NULL儲存在資料塊中的編碼。

SQL> SELECT DUMP(NULL) FROM DUAL;

DUMP
----
NULL

可以認為SYS_OP_MAP_NONNULL返回的就是這個資料型別儲存的編碼:

SQL> CREATE TABLE T_TEST          
  2  (ID NUMBER,
  3  C1 LONG,
  4  C2 CLOB);

表已建立。

SQL> INSERT INTO T_TEST
  2  VALUES (1, 'ABC', 'DEF');

已建立 1 行。

SQL> SELECT DUMP(C1) FROM T_TEST;
SELECT DUMP(C1) FROM T_TEST
            *
1 行出現錯誤:
ORA-00997:
非法使用 LONG 資料型別


SQL> SELECT DUMP(C2) FROM T_TEST;
SELECT DUMP(C2) FROM T_TEST
            *
1 行出現錯誤:
ORA-00932:
資料型別不一致: 應為 -, 但卻獲得 CLOB


SQL> SELECT SYS_OP_MAP_NONNULL(C1) FROM T_TEST;

SYS_OP_MAP_NONNULL(C1)
--------------------------------------------------------------------------------------------
01000186000000D104000000820100012A9013002A90130008003F00E83F000000000000000000000000D7D103003200030000000000000060000000909500D1030100000000000000000000000000000000000000000000000000000000000000000000080000005496D7D10301000004002A009E0900004400C0006C0E150


SQL> SELECT SYS_OP_MAP_NONNULL(C2) FROM T_TEST;

SYS_OP_MAP_NONNULL(C2)
-------------------------------------------------------------------------------------------
006A0001020C8800000200000001000000AB8D630013902B0013902A000300030354000100440045004600000000000000000000D1D7965701030004002A0000099E00C000440E6C150000000013902A0100018600000016090000000000000600000000000100440045004600

二者還有一個很重要的區別就是DUMP不支援LONG以及大物件,而SYS_OP_MAP_NONNULL則支援任意的資料型別。

利用Oracle的這個功能,可以更方便的檢查資料的儲存格式。

 

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