我已经创建了甲骨文PSL/SQL中使用以下嵌套表:如何创建使用Oracle
我创建了一个类型Animal
。
这具有属性:名称,年龄
我已创建类型Dog
。这种类型继承Animal
Dog
中唯一的额外字段是一个嵌套的地方住址表。我想在动物表中存储Dog
的所有实例。
这是我很困惑的一点:在创建Animal
类型的动物表时,如何创建places lived
的嵌套表? Animal
没有字段,只有在Dog
。
我已经创建了甲骨文PSL/SQL中使用以下嵌套表:如何创建使用Oracle
我创建了一个类型Animal
。
这具有属性:名称,年龄
我已创建类型Dog
。这种类型继承Animal
Dog
中唯一的额外字段是一个嵌套的地方住址表。我想在动物表中存储Dog
的所有实例。
这是我很困惑的一点:在创建Animal
类型的动物表时,如何创建places 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;
要为我们这样做金鱼创造一项纪录:
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是一种编程范例,只能用于编写程序。数据应始终保持在关系结构中。
非常感谢这个 这非常帮助我! :D 出于兴趣,您最喜欢编写PSL/SQL的编辑器是什么? – dewijones92
@ dewijones92 - 对于我职业生涯的大部分时间,我都对TextPad和SQL * Plus感到满意。然而,最近我迷恋Allround Automation的PL/SQL Developer:这个许可证非常合理,并且工作得很好。 – APC
+1,thanks.i阅读它,它非常有帮助。 – vikiiii
这可能只是一个例子 - 但不是一个好的模式设计。该动物不应该包含对生活场所的任何引用 - 这是一个规范化问题 – Randy
@Randy - 面向对象的编程主要是关于层次结构而不是关系。因此标准化在这里是无关紧要的。这是“对象 - 关系阻抗”的根本原因。但考虑到Oracle的OO实现允许嵌套表,想知道如何使用它们是合理的。 – APC
@vikiiii - fnord。我不认为你掌握了继承和多态如何在面向对象编程中工作。 – APC