什么是类型的子对象?

the*_*oop 5 oracle types

all_objectstheres aa列中调用SUBOBJECT_NAME,文档说这是:

子对象的名称(例如,分区)

如果您执行以下查询:

select * 
  from all_objects
 where owner = 'MDSYS' 
   and object_name = 'SDO_TGL_OBJECT_ARRAY'
Run Code Online (Sandbox Code Playgroud)

您发现它MDSYS.SDO_TGL_OBJECT_ARRAY有一个名为的子对象$VNS_1.它是什么?类型如何具有子对象?

APC*_*APC 2

有时,文档的含义与它所说的一模一样

作为说明,我有一个名为 的表RANGE_PART_INTERVAL_TABLE,它具有三个分区。我对 ALL_OBJECTS 运行相关查询,瞧!

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>
Run Code Online (Sandbox Code Playgroud)

我认为问题在于“对象”这个词的使用。Oracle 诞生于面向对象编程之前的时代(如果你能想象这样的事情的话)。它的数据字典使用“数据库对象”来表示“事物”——表、视图、序列、过程等。当 Oracle 将 OOP 引入数据库时​​,它使用关键字 . 来表示TYPE这些新事物。因此,视图 ALL_OBJECTS 是您的模式拥有权限的所有内容的列表而不仅仅是用户定义的类型。

编辑

需要明确的是,这与类型继承无关。

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> 
Run Code Online (Sandbox Code Playgroud)

继承由 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>
Run Code Online (Sandbox Code Playgroud)

编辑2

TheCoop 指出:

类型不能有分区

他们引用的具体案例$VNS_1是类型进化的产物。当我们在该类型已被使用后执行 ALTER TYPE 时,Oracle 会创建它的一个版本。我们可以在 %_TYPE_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>
Run Code Online (Sandbox Code Playgroud)

了解更多