我试图在两个具有完全相同键结构的Oracle表之间创建一个可更新的视图。现有表由企业资源规划系统创建,并:
有没有办法在这两个表之间创建一个可更新的视图?
相关的实际表包含大量数据,并且大量使用,因此对索引的任何更改/添加都需要进行大量的回归测试,因此我需要将任何解决方案局限于视图本身。
问题似乎与Oracle为降序KEY2字段创建单独的基于复合函数的索引有关。我试着向视野中投了几个提示,但我已经超出了我的深度,我真的不太清楚我在做什么。
下面是一个简化的例子。如果我从两个KEY2索引字段中删除了"desc“,那么最终的更新就会工作--如果我把它留在其中的话:"ORA-01779:无法修改映射到非密钥保存表的列”。
create table TEST_KEY_PRES_A (
KEY1 varchar2(8) not null,
KEY2 varchar2(8) not null,
VAL1 smallint not null,
VAL2 varchar2(8) not null
)
;
create unique index TEST_KEY_PRES_A_IDX
on TEST_KEY_PRES_A (KEY1, KEY2 desc)
;
insert into TEST_KEY_PRES_A values ('K11', 'K21', 1, 'V2-1');
insert into TEST_KEY_PRES_A values ('K15', 'K25', 5, 'V2-5');
create table TEST_KEY_PRES_B (
KEY1 varchar2(8) not null,
KEY2 varchar2(8) not null,
VAL3 varchar2(8) not null
)
;
create unique index TEST_KEY_PRES_B_IDX
on TEST_KEY_PRES_B (KEY1, KEY2 desc)
;
insert into TEST_KEY_PRES_B values ('K11', 'K21', 'V3-1');
insert into TEST_KEY_PRES_B values ('K15', 'K25', 'V3-5');
create view TEST_KEY_PRES_VW (KEY1, KEY2, VAL1, VAL2, VAL3) AS
select pa.KEY1, pa.KEY2, pa.VAL1, pa.VAL2, pb.VAL3
from TEST_KEY_PRES_A pa
join TEST_KEY_PRES_B pb on pa.KEY1 = pb.KEY1 and pa.KEY2 = pb.KEY2
where pa.VAL1 > 3
;
update TEST_KEY_PRES_VW
set VAL2 = 'V2-5-X'
where KEY1 = 'K15'
;使用Eduard建议的触发器而不是触发器:
create or replace trigger TEST_KEY_PRES_VW_UPD_TR
instead of update on TEST_KEY_PRES_VW
for each row
begin
update TEST_KEY_PRES_A
set VAL1 = :new.VAL1, VAL2 = :new.VAL2
where KEY1 = :new.KEY1 and KEY2 = :new.KEY2;
update TEST_KEY_PRES_B
set VAL3 = :new.VAL3
where KEY1 = :new.KEY1 and KEY2 = :new.KEY2;
end;发布于 2020-05-22 06:18:17
如果您不需要创建视图,而只需要使用join进行更新,那么我们可以使用MERGE语句的解决方案。
merge into TEST_KEY_PRES_A pa
using TEST_KEY_PRES_B pb
on (pa.KEY1 = pb.KEY1 and pa.KEY2 = pb.KEY2 and pa.VAL1 > 3 and pa.KEY1 = 'K15')
when matched then update
set VAL2 = 'V2-5-X';https://dba.stackexchange.com/questions/267663
复制相似问题