Oracle 巢狀表

散葉涔發表於2012-05-15

本文轉自:http://www.cnblogs.com/starzhao/archive/2010/05/19/1739234.html

oracle巢狀表示例

----巢狀表:就是把一個表中的欄位定義為一個表,這個欄位表的資料儲存在外部的一個表中,
例如下例巢狀表中的資料儲存在required_tab表中。
----巢狀表可以有效地代替多個表之間的連線
create type bookobj as object(
title varchar2(40),
author varchar2(40),
catalog_number number(4)
);
/
create type booklist as table of bookobj; -----------定義一個巢狀表,該表可以被巢狀在其他表中,他的欄位就是bookobj中的欄位
/
create table course_material(
department char(3),
course number(3),
required_reading booklist -----在表中再定義一個表,即booklist表,他就是巢狀在course_material中的表,也就是巢狀表。
------他和主表course_material之間是主從關係,即一條主表記錄對應一個巢狀表中的多條記錄。
) nested table required_reading store as required_tab;
/
-----------------------給表和巢狀表輸入值,commit後被提交到資料庫裡儲存
declare
v_books booklist:=booklist(bookobj('ssss','www',444));-------定義一個booklist型別的巢狀表變數v_books,並給出初值。
begin
insert into course_material values('cs',101,booklist(bookobj('www','bbb',1),bookobj('aa','dd',33)));
insert into course_material values('his',301,v_books);
end;
或單獨插入一條記錄:
insert into course_material values('ss',102,booklist(bookobj('w','b',1),bookobj('a','d',3)));
-----------------------更新巢狀表操作,即將required_reading作為一個欄位
declare
v_books booklist:=booklist(bookobj('xyz','bbb',111),bookobj('zq','ccc',222));
begin
update course_material
set required_reading = v_books
where department = 'his' and course = 301;
end;
----執行結果為子記錄全部被刪除,新新增兩個bookobj記錄
-------------刪除巢狀表中的記錄
delete from course_material where department = 'his';----對應主表his的巢狀表中的記錄將被刪除
=============直接對巢狀表進行插入==================
insert into the(select required_reading from course_material where department='his' )
values('gog','ggg',999)
-----上面紅色的表示一個表,注意前面必須加上the,表示是巢狀表。
=============直接對巢狀表進行更新==================
update the(select required_reading from course_material where department='his' )
set catalog_number = catalog_number + 10 -----對巢狀表中的欄位進行操作
where catalog_number = 111;
=============直接對巢狀表進行刪除==================
delete from the(select required_reading from course_material where department='his' )
where catalog_number = 111;
=========================直接進行巢狀表的查詢,只能返回主表的一條記錄的子表,即如果course_material返回多於2條的記錄則報錯
select * from the(select required_reading from course_material where department='his');

select * from the(select required_reading from course_material where department='his') where catalog_number=999
報錯:select * from the(select required_reading from course_material where department in ('his','www'))

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26892340/viewspace-723597/,如需轉載,請註明出處,否則將追究法律責任。

相關文章