TABLE居然也是資料型別

yangtingkun發表於2009-02-19

發現了一個很有意思的現象,居然TABLE也可以當作資料型別用。

 

 

TABLE作為資料型別建表:

SQL> CREATE TABLE T_TABLE (ID TABLE);

表已建立。

SQL> DESC T_TABLE
 
名稱                                                              是否為空? 型別
 ----------------------------------------------------------------- -------- --------------
 ID                                                                         RAW(16)

建表沒有報錯就很神奇了,在看看ID列的資料型別,居然是RAW(16)

STANDARD包中沒有找到對TABLE的定義,而且這個TABLE型別在PL/SQL中也是不可用的:

SQL> DECLARE
  2  V_TAB TABLE;
  3  BEGIN
  4  INSERT INTO T_TABLE VALUES (V_TAB);
  5  END;
  6  /
V_TAB TABLE;
           *
2 行出現錯誤:
ORA-06550:
2 , 12
:
PLS-00103:
出現符號 ";"在需要下列之一時:

(

查詢了一下DBA_TYPES檢視,倒是存在TABLE型別:

SQL> SELECT TYPE_NAME, TYPE_OID
  2  FROM DBA_TYPES
  3  WHERE TYPE_NAME = 'TABLE';

TYPE_NAME                      TYPE_OID
------------------------------ --------------------------------
TABLE                          0000000000000000000000000000001E

可以發現TABLE型別的TYPE_OID的資料型別倒是RAW(16)

SQL> SELECT DATA_TYPE, DATA_LENGTH
  2  FROM DBA_TAB_COLUMNS
  3  WHERE TABLE_NAME = 'DBA_TYPES'
  4  AND COLUMN_NAME = 'TYPE_OID'
  5  AND WNER = 'SYS';

DATA_TYPE                      DATA_LENGTH
------------------------------ -----------
RAW                                     16

莫非是Oracle把這個型別作為TABLE的型別。

透過設定EVENTS跟蹤了一下,沒有找到任何有價值的東西,懷疑這部分是在Oracle的核心中透過C實現的,因此看不到具體是如何實現的。

不過這個SQL語句在91011中都可以執行,不知道是Oracle有意為之,還是一個沒有被發現的bug

 

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

相關文章