| Oracle FAQ | Your Portal to the Oracle Knowledge Grid | |
|  |  | |||
Home -> Community -> Usenet -> c.d.o.misc -> Re: Update view problem
A copy of this was sent to "Mr. Chow Wing Siu" <wschow_at_Comp.HKBU.Edu.HK>
(if that email address didn't require changing)
On 18 Nov 1999 23:38:04 GMT, you wrote:
>rtproffitt_at_my-deja.com wrote:
>> In my sample, I get an error message:
>> update bobv set x='new' where x='old'
>>        *
>> ERROR at line 1:
>> ORA-01732: data manipulation operation not legal on this view
>> Can you be more specific?
>
>Yes.  This is the correct error message which I get.
>
>
>> Could you not just simply run two updates?
>
>>     Update t1_at_db1
>>     set x='new'
>>     where x='old';
>
>>     Update t1_at_db2
>>     set x='new'
>>     where x='old';
>
>This is feasible but when I need to port to Visual Basic.
>How to specific two data source and field and update to
>two databases?  That's why I need to find out the view
>to resolve my problem.
>
Oracle8.0 and up allows ANY view to be updated. You can code the logic to update in an INSTEAD of trigger. consider:
tkyte_at_8.0> create table t1 ( x int primary key, data varchar2(25) ); Table created.
tkyte_at_8.0> create table t2 ( y int primary key, data varchar2(25) ); Table created.
tkyte_at_8.0> create or replace view v  ( a, b )
  2  as
  3  select * from t1
  4  UNION ALL
  5  select * from t2;
View created.
tkyte_at_8.0> insert into t1 values ( 5, null ); 1 row created.
tkyte_at_8.0> insert into t2 values ( 5, null ); 1 row created.
tkyte_at_8.0> update v set b = 'Hello World' where a = 5; update v set b = 'Hello World' where a = 5
       *
ERROR at line 1:
ORA-01732: data manipulation operation not legal on this view
tkyte_at_8.0> create or replace trigger v_trigger
  2  instead of UPDATE on v
  3  for each row
  4  begin
5 update t1 set x = :new.a, data = :new.b where x = :old.a; 6 update t2 set y = :new.a, data = :new.b where y = :old.a;7 end;
Trigger created.
tkyte_at_8.0> 
tkyte_at_8.0> update v set  b = 'Hello World' where a = 5;
2 rows updated.
tkyte_at_8.0> 
tkyte_at_8.0> select * from v;
A B
---------- -------------------------
         5 Hello World
         5 Hello World
tkyte_at_8.0>
>
>> Or if timing is a problem, then do one at a time....
>> Create a list of the x's which are old,
>> then LOOP through the list doing  the two
>> updates for each individual item in the list...
>> doing a COMMIT every 1 - n rows (as you see fit).
>
>> Also remember that your view is defined as UNION,
>> which will sort and remove duplicates...you may want
>> UNION ALL instead.
>
>> Robert Proffitt
>> Beckman Coulter
>> Brea, California
>
>
>Yes.  It requires a COMMIT for each update (really necessary?).
>
No -- you don't need a commit for each update. you would update/update and then commit.
>Instead of updating to two databases for the same pair of data,
>the last resort is to:
>
>	site 1				site 2
>	Table A (view from site 2)	Table A
>	Table B				Table B (view from site 2)
>
>Updating any data requires a two phase commit.  But I ask
>if one site (for example site 2) is down, can site 1 work
>normally?  I mean update/insert/delete Table A at site 1.
>
>Thanks for help.
-- 
See http://osi.oracle.com/~tkyte/ for my columns 'Digging-in to Oracle8i'...
Current article is "Part I of V, Autonomous Transactions" updated June 21'st
 
Thomas Kyte tkyte_at_us.oracle.com Oracle Service Industries Reston, VA USA
Opinions are mine and do not necessarily reflect those of Oracle Corporation Received on Fri Nov 19 1999 - 07:28:53 CST
|  |  |