多表視圖的定義:當視圖的資料來源只有一張資料表,則該視圖為單表視圖;當視圖的資料來源是多張資料表,則該視圖為多表視圖。 可更新視圖的定義:在絕大多數人的概念中,視圖是唯讀,不允許修改。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 主鍵,如果多表可更新視圖中,包括外聯<如:Where t1.t11=t2.t11(+)>,則必須在FORM中定義主鍵,包括資料區塊的主鍵和資料項目的主鍵屬性。否則,FORM將會提示“視圖不允許更新”。 4.2.2 SQL,多表視圖如果使用Union或Distinct,則前台FORM可能無法實現更新功能。 |