oracle檢視可以update嗎

hd_system發表於2016-12-24
create or replace view update_ed as
select e.empno,e.ename,d.deptno,d.dname,e.comm from emp e,dept d where e.deptno = d.deptno

select * from update_ed t

update update_ed set comm=1000
update /*+ BYPASS_UJVC */update_ed set comm=1000

update update_ed set ename = 'HANDE' where empno=7654
update /*+ BYPASS_UJVC */update_ed set ename = 'HANDE' where empno=7654

/*insert into update_ed(empno,ename,deptno,dname) values('1001','KKK','90','XXH')
insert into \*+ BYPASS_UJVC *\update_ed(empno,ename,deptno,dname) values('1001','KKK','90','XXH')
insert into update_ed(ename) values('KKK')*/
*****************************************************************************************
一說到檢視是否可以update,我就在想,如果檢視只包含一張表,應該是可以update的,因為SQL會執行查詢轉換,將檢視轉成表。那多個表關聯的檢視,是否可以update呢,下面我們來做個試驗:
 
SQL> create table t1 as select * from dba_objects;
 
表已建立。
SQL> create table t2 as select * from dba_objects;
表已建立。
 
 
 -- 可以看到單個表建檢視,是可以update
SQL> create or replace view v_test as select * from t1;
檢視已建立。
SQL> update v_test set subobject_name=owner;
已更新50593行。
SQL> commit;
提交完成。
 
 
-- 多個表建檢視,需要加hint BYPASS_UJVC後才能update成功
SQL> create or replace view v_test as select t1.* from
  2  t1,t2 where t1.object_id=t2.object_id;
檢視已建立。
SQL> update v_test set subobject_name=owner;
update v_test set subobject_name=owner                  *
第 1 行出現錯誤:
ORA-01779: 無法修改與非鍵值儲存表對應的列
 
SQL> update /*+ BYPASS_UJVC */v_test set subobject_name=owner;
已更新50592行。
SQL> commit;
提交完成。
    
 
SQL> create or replace view v_test as select t1.object_id,t2.subobject_name,
  2  t1.owner from
  3  t1,t2 where t1.object_id=t2.object_id;
檢視已建立。
SQL> update /*+ BYPASS_UJVC */v_test set subobject_name=owner;
已更新50592行。
SQL> commit;
提交完成。

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

相關文章