在Oracle9i出現之前,Oracle視圖總是從它們的基表(base tables)中動態產生的,並且視圖中不能包含約束。通過隱藏所有的內部表格連接操作,Oracle視圖可以簡化復雜的查詢。
例如,下面的視圖用以顯示五金(widget)產品的訂貨信息。
create or replace vIEw
widget_orders
as
select
cust_name,
order_date,
product_name,
sum(qty*price) total cost
from
customer
natural join
orders
natural join
order_item
natural join
product
where
product_type = 'widget';
在定義了這個視圖之後,我們就能過對它進行復雜的查詢。
select * from widget_orders where order_date > sysdate-5;
傳統的視圖所帶來的問題就是我們不能對視圖定義參考完整性約束(referential integrity constraints)。從Oracle9i開始,Oracle支持下面的視圖約束。
非空(NOT NULL):這個約束總是從創建視圖的基表中繼承而來的。
唯一性約束(Unique constraints):Oracle9i允許對視圖的任意一欄定義唯一性約束。
主鍵(Primary key):我們可以直接給視圖定義主鍵約束。
外鍵(Foreign Key):只要視圖有依賴於其它基表的外鍵,那麼就會直接存在外鍵參考完整性。
正如你所知道的那樣,對視圖的參考完整約束進行管理會極大的影響到查詢的性能。
在Oracle9i中,我們能夠回避非約束視圖所帶來的問題。下面的例子對一個視圖創建了主鍵約束。
alter vIEw
widget_orders
add constraint
widget_orders_pk
primary key
(cust_name, order_date, product_name)
disable novalidate;