case:在scott.emp中有一個字段為deptno用來存儲部門編號,在關系型數據庫中一個字段只能夠存儲一列值(像ENAME列只能夠存儲員工姓名的值),要想查詢emp與dept兩表間的關聯值還得運用主從表間的關系,查詢效率不高,在emp表中deptno字段并不是很復雜(因為dept表中僅三個字段)的情況下,oracle允許在emp表中的deptno字段里存儲一個表,這雖然違反關系型數據庫的規則,但是提高了性能。
我們將舉一個入庫明細的例子來說明可變數組在上面類似情況的應用。
創建一個入庫的明細類型mingxitype:
SQL
>
?
create
?
or
?
replace
?type?mingxitype?
as
?object
??
2
??(
??
3
?????goodsid?
varchar
(
15
),
??
4
?????incount?
int
,
??
5
?????providerid?
varchar
(
10
)
??
6
??);
??
7
??
/
創建一個基于mingxitype類型的可變數組:
SQL
>
?
create
?
or
?
replace
?type?arrmingxitype?
as
?varray(
100
)?
of
?mingxitype;
??
2
??
/
創建一個產品入庫主表:
SQL
>
?
create
?
table
?instock
??
2
??(
??
3
?????orderid?
int
?
primary
?
key
,
??
4
?????indate?date,
??
5
?????mingxi?arrmingxitype
??
6
??);
向主表中插入數據:
SQL
>
?
insert
?
into
?instock?
values
(
1001
,to_date(
'
2006-1-1
'
,
'
YYYY-MM-DD
'
),arrmingxitype
??
2
??(mingxitype(
'
101
'
,
10
,
'
S01
'
),mingxitype(
'
102
'
,
30
,
'
S05
'
)));
通過查詢可以查出主表instock中的字段mingxi中其實包括了一張表的內容,因為顯示出來的arrmingxitype可變數組內容比較零亂,降低了可讀性,運用PL/SQL可以讀出,但是這里我們用table()函數即可完成這個輸出修改,SQL語句如下:
SQL
>
?
select
?
*
?
from
?
table
(
select
?s.mingxi?
from
?instock?s?
where
?orderid
=
1001
);

GOODSID????????????INCOUNT?PROVIDERID
--
-------------?----------?----------
101
?????????????????????
10
?S01
102
?????????????????????
30
?S05
這樣,通過在表中插入一個可變數組就將文中case里的問題給解決了。
可變數組也有一定的缺陷,比如更新起來比較麻煩,因為不能更新varray中的單個元素,也就意味著,如果要去更新varray中的某個字段,需得將整個varray中的數據全部重新輸入一次,所以,可變數組在應用過程中需得慎重選擇,可以將其應用于一些平常不需要去修改數據的環境中,比如醫院里醫生開的處方歸檔資料庫等case中。
我們將舉一個入庫明細的例子來說明可變數組在上面類似情況的應用。
創建一個入庫的明細類型mingxitype:







創建一個基于mingxitype類型的可變數組:


創建一個產品入庫主表:






向主表中插入數據:


通過查詢可以查出主表instock中的字段mingxi中其實包括了一張表的內容,因為顯示出來的arrmingxitype可變數組內容比較零亂,降低了可讀性,運用PL/SQL可以讀出,但是這里我們用table()函數即可完成這個輸出修改,SQL語句如下:






這樣,通過在表中插入一個可變數組就將文中case里的問題給解決了。
可變數組也有一定的缺陷,比如更新起來比較麻煩,因為不能更新varray中的單個元素,也就意味著,如果要去更新varray中的某個字段,需得將整個varray中的數據全部重新輸入一次,所以,可變數組在應用過程中需得慎重選擇,可以將其應用于一些平常不需要去修改數據的環境中,比如醫院里醫生開的處方歸檔資料庫等case中。