我在Oracle PSL / SQL中创建了以下内容:
我创建了一个Animal
类型
它具有以下属性:名称,年龄
我创建了Dog
类型。这继承自Animal
类型
Dog
中唯一的额外字段是居住地的引用的嵌套表。我想将所有Dog
实例存储在Animal表中。
这是我感到困惑的一点:在创建Animal
类型的Animal表时,如何为places lived
创建嵌套表? Animal
中没有字段,仅在Dog
中。
答案 0 :(得分:6)
“在创建Animal类型的Animal表时,如何创建 “生活的地方”的嵌套表?当Animal中没有字段时 这只是在狗身上。“
这是继承的奥秘。从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文档中有一本专门讨论其对象关系功能的书。 Find out more
注意:我在这里使用了一个对象表,因为很容易说明嵌套表的工作原理。我不建议使用类型进行数据存储:OO是一种编程范例,只能用于编写程序。数据应始终保持在关系结构中。