Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What is a subobject for a type?

Tags:

types

oracle

In all_objects theres a a column called SUBOBJECT_NAME, and the docs say that this is:

Name of the subobject (for example, partition)

If you do the following query:

select * 
  from all_objects
 where owner = 'MDSYS' 
   and object_name = 'SDO_TGL_OBJECT_ARRAY'

You find that MDSYS.SDO_TGL_OBJECT_ARRAY has a subobject called $VNS_1. What is it? How can types have subobjects?

like image 662
thecoop Avatar asked Nov 06 '22 17:11

thecoop


1 Answers

Sometimes the documentation means exactly what it says.

By way of illustration, I have a table called RANGE_PART_INTERVAL_TABLE which has three partitions. I run the pertinent query against ALL_OBJECTS, and lo!

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>

I think the problem is the use of the word "objects". Oracle comes from a time before Object-Oriented Programming (if you can imagine such a thing). Its data dictionary uses "database object" to mean "thing" - table, view, sequence, procedure, etc. When Oracle introduced OOP into the database it used the keyword TYPE.for these new things. So the view ALL_OBJECTS is a list of all the things your schema has privileges on, not just the user-defined types.

edit

Just to be clear, this has nothing to do with type inheritence.

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> 

Inheritence is shown by the USER/ALL/DBA_TYPES view, which shows the supertype of the derived type:...

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

TheCoop points out:

types can't have partitions

In the specific case they cites $VNS_1 is an artefact of Type Evolution. When we execute an ALTER TYPE after that Type has been in use Oracle creates a version of it. We can see this in the %_TYPE_VERSIONS views....

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.

like image 72
APC Avatar answered Nov 15 '22 10:11

APC