如题,可以对一个view里的数据进行update么?
类似于下边这种。
UPDATE (
     SELECT
            DEPT_NO, USER_NAME
     FROM USER_MASTER
     WHERE  DEPT_NO = '1002'
) view_1
SET
    USER_NAME = USER_NAME || ' 氏',
    MODIFIED_ON = SYSDATE如果可以更新的话,那对view实际关联的本表由什么影响。以后每次执行view,是update后固定的数据,还是于本表关联的数据?

解决方案 »

  1.   

    可以更新,但要保证view中不能包含sum,max,group等语句
      

  2.   


    是可以的,刚才vc555大哥刚在一个帖里回复的,
    不过update的情况,必须是一下情况1.  view的字段只涉及一个表。
    2.  如果涉及多个表的话,被(涉及到的)view列所映射table列(或列的组合)必须是有主健约束的
    3.  强制执行,方法是加上hint /*+ BYPASS_UJVC */SQL> CREATE TABLE test1 ( id integer primary key, num integer );
    SQL> INSERT INTO test1 VALUES (1,0);
    SQL> INSERT INTO test1 VALUES (2,0);SQL> CREATE TABLE test2 ( id integer, num integer, upd integer );
    SQL> INSERT INTO test2 VALUES (1,10, 0);
    SQL> INSERT INTO test2 VALUES (2,20, 1); SQL> UPDATE ( SELECT t1.id id1, t1.num num1, t2.id id2, t2.num num2 FROM test1 t1, test2 t2 WHERE t1.id=t2.id AND t2.upd=1) SET num1=num2;
    ORA-01779: cannot modify a column which maps to a non key-preserved tableSQL> CREATE UNIQUE INDEX test2_idx_001 ON test2 (id);
    SQL> UPDATE ( SELECT t1.id id1, t1.num num1, t2.id id2, t2.num num2 FROM test1 t1, test2 t2 WHERE t1.id=t2.id AND t2.upd=1) SET num1=num2;
    1 row updated.SQL> UPDATE ( SELECT  /*+ BYPASS_UJVC */ t1.id id1, t1.num num1, t2.id id2, t2.num num2 FROM test1 t1, test2 t2 WHERE t1.id=t2.id AND t2.upd=1) SET num1=num2;