Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 类型的子对象是什么?_Oracle_Types - Fatal编程技术网

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*时会得到什么?但是,据我所知,类型不能有分区。因此,当对象是一个类型时,此列必须表示其他内容,但我找不到关于它对类型意味着什么的信息。