2012-12-02 65 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

相關問題