如何使用Oracle创建嵌套表

dew*_*s92 1 sql oracle user-defined-types

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

我创建了一个类型Animal.
它具有以下属性:Name,Age

我创建了这种类型Dog.这继承自类型Animal
唯一的额外字段Dog是一个嵌套的地方居住的参考表.我想存储DogAnimal表中的所有实例.

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

APC*_*APC 6

"当创建Animal类型的Animal表时,如何为"place lived"创建嵌套表?当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;
Run Code Online (Sandbox Code Playgroud)

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

insert into animals
  values (animal_t('BOB', 7))
/
Run Code Online (Sandbox Code Playgroud)

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

insert into animals
  values (dog_t('FIDO', 12, places_nt('Balham', 'Tooting')))
/
Run Code Online (Sandbox Code Playgroud)

此查询将只选择通用列:

SQL> select * from animals
  2  /

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

SQL>
Run Code Online (Sandbox Code Playgroud)

为了了解与狗有关的细节,我们需要将记录转换为相关的子类型:

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>
Run Code Online (Sandbox Code Playgroud)

Oracle文档中有一本专门介绍其对象关系功能的书. 了解更多.


注意:我在这里使用了一个对象表,因为很容易说明嵌套表的工作原理.我不建议使用类型进行数据存储:OO是一种编程范例,只能用于编写程序.数据应始终保持在关系结构中.

  • @ dewijones92 - 在我职业生涯的大部分时间里,我对TextPad和SQL*Plus感到满意.然而,最近我已经迷恋于Allround Automation的PL/SQL开发人员:许可证非常合理,而且效果非常好. (2认同)