INSTEAD OF(zt)

zhouwf0726發表於2019-05-24

多表關聯後的資料能保證主鍵唯一的檢視是可直接做更新,不需要用觸發器實現


多表檢視的定義:當檢視的資料來源只有一張資料表,則該檢視為單表檢視;當檢視的資料來源是多張資料表,則該檢視為多表檢視。
可更新檢視的定義:在絕大多數人的概念中,檢視是隻讀的,不允許修改。ORACLE 8i以上版本,單表檢視如果沒有設定With Read Only,則該檢視是可以更新的,對檢視的操作將直接寫入的資料表中。
那麼,如果檢視的資料來源是多張資料表,而多表檢視如果實現可更新檢視,則可以大大提高編碼的效率。

1 前言
多表檢視的定義:當檢視的資料來源只有一張資料表,則該檢視為單表檢視;當檢視的資料來源是多張資料表,則該檢視為多表檢視。
可更新檢視的定義:在絕大多數人的概念中,檢視是隻讀的,不允許修改。ORACLE 8i以上版本,單表檢視如果沒有設定With Read Only,則該檢視是可以更新的,對檢視的操作將直接寫入的資料表中。
那麼,如果檢視的資料來源是多張資料表,而多表檢視如果實現可更新檢視,則可以大大提高編碼的效率。

2 多表可更新檢視的應用範圍
在程式實現過程中,我們往往會將諸如產品編號、計量單位、客戶資訊等等儲存於獨立的資料表,在銷售單據、出入庫單據等處,引用其主鍵ID,就可以指向相關詳細資訊。
在查詢檢視上,我們僅需要確定關聯關係即可,但在資料錄入介面,我們要實現多表資訊同步編輯功能時,往往會遇到困擾。需要應用各種各樣的程式設計方法,實現使用者需求。
多表可更新檢視大大簡化前臺程式設計的工作量,對於前臺FORM,可以認為該多表可更新檢視就是一張完整的業務資料表,而資料的儲存邏輯則建立於後臺檢視的Instead of 觸發器中。

3 多表可更新檢視的後臺實現
建立多表檢視的Instead Of Trigger,在Trigger中定義資料儲存邏輯,就實現了多表可更新檢視。例項如下:
3.1 建立測試資料表
--===================================================
--建立測試表
--===================================================
Drop Table t1;
Drop Table t2;
create table t1
( t11 numeric(28),t12 varchar2(20));
create table t2
( t11 numeric(28),t22 varchar2(20));
3.2 多表檢視範例
--===================================================
--建立測試檢視
--===================================================
create Or Replace view t as
select T1.t11 f1 ,T1.t12 f2 ,T2.t22 f3
from T1,T2
Where T1.t11=T2.t11;
3.3 多表檢視觸發器範例
--===================================================
--建立檢視的替代觸發器
--===================================================
Create Or Replace Trigger Trg_InsUpdDel_t
Instead Of Insert or update or delete
on t
for each row
Declare
begin
If Inserting Then
Insert Into t1 (t11,t12) Values (:New.f1,:New.f2);
Insert Into t2 (t11,t22) Values (:New.f1,:New.f3);
elsif Updating Then
Update t1 set t11=:New.f1,t12=:New.f2 where t11=:New.f1;
Update t2 set t11=:New.f1,t22=:New.f3 where t11=:New.f1;
elsif Deleting then
Delete from t1 where t11=:Old.f1;
Delete from t2 where t11=:Old.f1;
End if;
end;
如此即實現多表可更新檢視的定義工作,大家可以試著使用Insert或Delete或Update的SQL語句測試一下。
3.4 資料庫後臺注意事項
當檢視使用Create Or Replace View...重新編譯後,該觸發器就會被覆蓋,找不到了。所以大家記得在重新編譯多表可更新檢視之後,要重新建立其觸發器。

4 多表可更新檢視的前臺實現及注意事項
4.1 基本實現
在資料來源中,定義資料塊的資料來源為多表可更新檢視,即可實現前臺設定。
當然還有許多注意事項,否則大家在實際應用過程中就會覺得困難重重。
4.2 FORM前臺注意事項
4.2.1 主鍵,如果多表可更新檢視中,包括外聯,則必須在FORM中定義主鍵,包括資料塊的主鍵和資料項的主鍵屬性。否則,FORM將會提示“檢視不允許更新”。
4.2.2 SQL,多表檢視如果使用Union或Distinct,則前臺FORM可能無法實現更新功能。

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