3

我创建了以下两种对象类型:

create or replace type person_typ as object (
    person#                 varchar(10)
) not final;

create or replace type salesperson_typ under person_typ (
    salesperson#            varchar(10),
    sSurname                varchar(10),
    sForename               varchar(10),
    dateOfBirth             date
);

create table person_tab of person_typ (
    person# primary key
);

我已经使用以下方法插入了一行:

insert into person_tab
values (salesperson_typ('p1','s1', 'Jones', 'John', sysdate));

我可以使用以下内容检索:

select 
    treat(value(s) as salesperson_typ).person# as person_number, 
    treat(value(s) as salesperson_typ).sSurname as sSurname
from 
    person_tab s
;

但是,如果我看一下,person_tab我只会看到以下内容:

SQL> select * from person_tab;

PERSON#
----------
p1

我很好奇,salesperson具体数据存储在哪里?我几乎期待找到一张salesperson桌子,但我找不到任何明显的东西。

4

1 回答 1

1

您的对象不可见地存储在同一个表中。您可以通过查询 USER_TAB_COLS 来检查列:

SELECT *
FROM user_tab_cols
WHERE table_name = 'PERSON_TAB';

然后,您可以使用刚刚在查询中发现的列名*(SYS_NC_ROWINFO$ 除外,这对我来说会引发错误)。

SELECT SYS_NC_OID$
      ,SYS_NC_TYPEID$ 
    --,SYS_NC_ROWINFO$
      ,PERSON#        
      ,SYS_NC00005$   
      ,SYS_NC00006$   
      ,SYS_NC00007$   
      ,SYS_NC00008$   
FROM PERSON_TAB;

笔记*

您不应在任何应用程序中使用这些列名,因为它们是内部的,并且在未来的补丁/版本中可能会发生变化。

于 2013-01-22T15:48:42.023 回答