发现了一个很有意思的现象,居然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语句在9、10和11中都可以执行,不知道是Oracle有意为之,还是一个没有被发现的bug。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/4227/viewspace-555730/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/4227/viewspace-555730/