gpt4 book ai didi

oracle - 什么是类型的子对象?

转载 作者:行者123 更新时间:2023-12-04 21:26:44 24 4
gpt4 key购买 nike

all_objects有一列名为 SUBOBJECT_NAME ,并且文档说这是:

Name of the subobject (for example, partition)



如果您执行以下查询:
select * 
from all_objects
where owner = 'MDSYS'
and object_name = 'SDO_TGL_OBJECT_ARRAY'

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

最佳答案

有时,文档的含义正是它所说的。

作为说明,我有一个名为 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>

我认为问题在于“对象”一词的使用。 Oracle 来自于面向对象编程之前的时代(如果你能想象这样的事情)。它的数据字典使用“数据库对象”来表示“事物”——表、 View 、序列、过程等。当 Oracle 将 OOP 引入数据库时​​,它使用关键字 TYPE 来表示这些新事物。因此, View 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>

继承由 USER/ALL/DBA_TYPES View 显示,它显示了派生类型的父类(super class)型:...
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>

编辑 2

TheCoop 指出:

types can't have partitions



在特定情况下,他们引用 $VNS_1 是类型进化的产物。当我们在该类型已被使用后执行 ALTER TYPE 时,Oracle 会创建它的一个版本。我们可以在 %_TYPE_VERSIONS View 中看到这一点......
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>

Find out more

关于oracle - 什么是类型的子对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2148912/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com