我已經創建了甲骨文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