1

我在 Oracle PSL/SQL 中创建了以下内容:

我创建了一个类型Animal
这具有以下属性:姓名、年龄

我已经创建了类型Dog。这继承自 typeAnimal
中唯一的额外字段Dog是一个嵌套的地方引用表。我想将所有实例存储Dog在 Animal 表中。

这是我感到困惑的一点:创建类型的 Animal 表时Animal,如何创建嵌套表places lived?这个没有字段Animal,只有Dog.

4

1 回答 1

6

“创建 Animal 类型的 Animal 表时,如何为“居住的地方”创建嵌套表?当 Animal 中没有此字段时,只有 Dog 中。

这就是传承的奥秘。从 ANIMAL 类型构建的表实际上具有支持其子类型属性的列。但是,它们只有在我们明确使用 DOG 子类型时才能访问。

这是您的数据结构。

create or replace type animal_t as object 
  ( name varchar2(10)
    , age number (3,0))
not final;
/

create or replace type places_nt as table of varchar2(20)
/

create or replace type dog_t under animal_t
 ( residence_history places_nt)
/

create table animals of animal_t;

要为金鱼创建记录,我们这样做:

insert into animals
  values (animal_t('BOB', 7))
/

要为狗创建记录,我们需要这样做:

insert into animals
  values (dog_t('FIDO', 12, places_nt('Balham', 'Tooting')))
/

此查询将只选择通用列:

SQL> select * from animals
  2  /

NAME              AGE
---------- ----------
BOB                 7
FIDO               12

SQL>

要查看与狗有关的详细信息,我们需要将记录转换为相关的子类型:

SQL> select treat(value(a) as dog_t)
  2  from animals a
  3  where value(a) is of (dog_t)
  4  /

TREAT(VALUE(A)ASDOG_T)(NAME, AGE, RESIDENCE_HISTORY)
--------------------------------------------------------------------------------
DOG_T('FIDO', 12, PLACES_NT('Balham', 'Tooting'))

SQL>

Oracle 文档中有一整本书专门介绍其对象关系特性。 了解更多


注意:我在这里使用对象表只是因为它很容易说明嵌套表的工作原理。我不推荐使用类型来存储数据:OO 是一种编程范式,应该只用于编写程序。数据应始终保存在关系结构中。

于 2012-12-02T16:25:27.863 回答