2012-12-02 135 views
1

我已经创建了甲骨文PSL/SQL中使用以下嵌套表:如何创建使用Oracle

我创建了一个类型Animal
这具有属性:名称,年龄

我已创建类型Dog。这种类型继承Animal
Dog中唯一的额外字段是一个嵌套的地方住址表。我想在动物表中存储Dog的所有实例。

这是我很困惑的一点:在创建Animal类型的动物表时,如何创建places lived的嵌套表? Animal没有字段,只有在Dog

+0

这可能只是一个例子 - 但不是一个好的模式设计。该动物不应该包含对生活场所的任何引用 - 这是一个规范化问题 – Randy

+0

@Randy - 面向对象的编程主要是关于层次结构而不是关系。因此标准化在这里是无关紧要的。这是“对象 - 关系阻抗”的根本原因。但考虑到Oracle的OO实现允许嵌套表,想知道如何使用它们是合理的。 – APC

+1

@vikiiii - fnord。我不认为你掌握了继承和多态如何在面向对象编程中工作。 – APC

回答

6

“当创建类型动物的动物表,如何创建为 嵌套表‘的地方住?’时,有动物的,只有在狗 这个没有现场。”

这是遗传的奥秘。从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是一种编程范例,只能用于编写程序。数据应始终保持在关系结构中。

+0

非常感谢这个 这非常帮助我! :D 出于兴趣,您最喜欢编写PSL/SQL的编辑器是什么? – dewijones92

+2

@ dewijones92 - 对于我职业生涯的大部分时间,我都对TextPad和SQL * Plus感到满意。然而,最近我迷恋Allround Automation的PL/SQL Developer:这个许可证非常合理,并且工作得很好。 – APC

+0

+1,thanks.i阅读它,它非常有帮助。 – vikiiii

相关问题