Oracle 类型的子对象是什么?
在Oracle 类型的子对象是什么?,oracle,types,Oracle,Types,在所有对象中有一列名为子对象名称,文档说这是: 子对象的名称(例如,分区) 如果执行以下查询: select * from all_objects where owner = 'MDSYS' and object_name = 'SDO_TGL_OBJECT_ARRAY' 您会发现MDSYS.SDO\u TGL\u OBJECT\u ARRAY有一个子对象,名为$VNS\u 1。这是怎么一回事?类型怎么可能有子对象呢?有时候文档的意思就是它所说的 作为说明,我有一个名为RANG
所有对象中
有一列名为子对象名称
,文档说这是:
子对象的名称(例如,分区)
如果执行以下查询:
select *
from all_objects
where owner = 'MDSYS'
and object_name = 'SDO_TGL_OBJECT_ARRAY'
您会发现
MDSYS.SDO\u TGL\u OBJECT\u ARRAY
有一个子对象,名为$VNS\u 1
。这是怎么一回事?类型怎么可能有子对象呢?有时候文档的意思就是它所说的
作为说明,我有一个名为RANGE\u PART\u INTERVAL\u table
的表,它有三个分区。我对所有的_对象运行相关的查询,瞧
SQL> select object_name, object_type, subobject_name
2 from all_objects
3 where object_name = 'RANGE_PART_INTERVAL_TABLE'
4 /
OBJECT_NAME OBJECT_TYPE SUBOBJECT_NAME
------------------------------ ------------------- ---------------
RANGE_PART_INTERVAL_TABLE TABLE
RANGE_PART_INTERVAL_TABLE TABLE PARTITION SYS_P60
RANGE_PART_INTERVAL_TABLE TABLE PARTITION SYS_P61
RANGE_PART_INTERVAL_TABLE TABLE PARTITION SYS_P62
SQL>
我认为问题在于“对象”一词的使用。Oracle起源于面向对象编程之前的时代(如果您可以想象这样的事情的话)。它的数据字典使用“数据库对象”来表示“事物”——表、视图、序列、过程等。当Oracle将OOP引入数据库时,它使用关键字TYPE
。来表示这些新事物。因此,视图ALL_对象是模式拥有特权的所有内容的列表,而不仅仅是用户定义的类型
编辑
需要明确的是,这与类型继承无关
SQL> create type my_type as object (attr1 number) not final
2 /
Type created.
SQL> create type my_sub_1 under my_type (attr2 date)
2 /
Type created.
SQL> select object_name, object_type, subobject_name
2 from all_objects
3 where object_name = 'MY_TYPE'
4 /
OBJECT_NAME OBJECT_TYPE SUBOBJECT_NAME
------------------------------ ------------------- ---------------
MY_TYPE TYPE
SQL>
继承由USER/ALL/DBA_TYPES视图显示,该视图显示派生类型的超类型:
SQL> select type_name, supertype_name
2 from all_types
3 where type_name in ('MY_TYPE', 'MY_SUB_1')
4 /
TYPE_NAME SUPERTYPE_NAME
------------------------------ ------------------------------
MY_SUB_1 MY_TYPE
MY_TYPE
SQL>
edit2
该委员会指出:
类型不能有分区
在特定情况下,他们引用的$VNS_1
是类型进化的产物。当我们在使用一个ALTER类型之后执行该类型时,Oracle会创建该类型的一个版本。我们可以在%\u TYPE\u VERSIONS视图中看到这一点
SQL> select * from dba_type_versions
2 where owner = 'MDSYS'
3 and type_name = 'SDO_TGL_OBJECT_ARRAY'
4 /
OWNER TYPE_NAME VERSION#
------------------------------ ------------------------------ ----------
TYPECODE STATUS LINE
------------------------------ ------- ----------
TEXT
------------------------------------------------------------------------------
HASHCODE
----------------------------------
MDSYS SDO_TGL_OBJECT_ARRAY 1
COLLECTION VALID 1
type SDO_TGL_OBJECT_ARRAY
61EB9AEC10198F71C141D13B32F52C00A8
MDSYS SDO_TGL_OBJECT_ARRAY 1
COLLECTION VALID 2
as VARRAY (1000000) of SDO_TGL_OBJECT
61EB9AEC10198F71C141D13B32F52C00A8
MDSYS SDO_TGL_OBJECT_ARRAY 2
COLLECTION VALID 1
type SDO_TGL_OBJECT_ARRAY
6184209BAEF1F731B937760C2BA8B45688
MDSYS SDO_TGL_OBJECT_ARRAY 2
COLLECTION VALID 2
as VARRAY (1000000) of SDO_TGL_OBJECT
6184209BAEF1F731B937760C2BA8B45688
MDSYS SDO_TGL_OBJECT_ARRAY 2
COLLECTION VALID 3
alter type SDO_TGL_OBJECT_ARRAY modify limit 10000000 cascade
6184209BAEF1F731B937760C2BA8B45688
SQL>
.Quick google给我的印象是,它意味着子对象。我们的示例查询使用了所有类型而不是所有对象,这会混淆您的问题。哎哟,使用了错误的查询:/只是好奇-当您从所有对象(其中对象名称=“$VNS\u 1”)中运行SELECT*时会得到什么?但是,据我所知,类型不能有分区。因此,当对象是一个类型时,此列必须表示其他内容,但我找不到关于它对类型意味着什么的信息。