sql - 可更新 View (Oracle)

标签 sql oracle

假设我们有以下内容:

create view view_1 as
(
  select key, data from some_table_or_view;
);

create table table_1
(
  key
  more_data
);

create view view_2 as
(
  select v1.key, v1.data, t1.more_data 
  from view_1 v1, table_1 t1 
  where v1.key = t1.key
);

create table table_2 as
(
  key
  data
  more_data
);

create view view_3 as
(
  select key, data, more_data from view_2
  union
  select key, data, more_data from table_2
);

基本上,我们连接了两个数据源,一个来自连接,一个是原始数据。

我希望能够执行以下操作。

update view_3 set more_data = 'BLAH_MORE_DATA' where key = 'BLAH_KEY';

以某种方式更新table_1table_2,具体取决于“BLAH_KEY”是来自table_1还是table_2

目前我能想到的唯一办法是:

create view view_3 as
(
  select 'TAB1' as source, key, data, more_data from view_2
  union
  select 'TAB2' as source, key, data, more_data from table_2
);

然后使用 PL/SQL 函数进行更新,该函数检查源列并更新相应的表,但这意味着我必须保持 View 和 PL/SQL 函数同步。

我正在寻找一种更好的方法来做到这一点。

最佳答案

您可以在 view_3 上使用替代触发器

CREATE OR REPLACE TRIGGER view3_trg
INSTEAD OF  UPDATE
ON view_3
FOR EACH ROW
BEGIN
IF :OLD.source = 'TAB1' THEN

  UPDATE table_1 t1
  set t1.data = :NEW.data
  WHERE
    t1.key = :OLD.key
  ;
ELSIF OLD.source = 'TAB2' THEN
   UPDATE table_2 t2
  set t2.data = :NEW.data
  WHERE
    t2.key = :OLD.key
  ;
END IF;
END;
/

关于sql - 可更新 View (Oracle),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6531729/

相关文章:

MySQL如何填充范围内缺失的日期?

mysql - Max() + group by 在 mysql 中没有按预期工作

java - 无法使用 ResetSet.getString 正确获取汉字

oracle - 为什么 Oracle Sql*Plus 会打印很多不需要的标题?

Oracle 表中的随机行

java - 通过Hibernate获取数据而不传递主键

java - 为什么这个 HQL 查询看起来不应该起作用,但它却起作用了?

sql - 从多个表中选择count(*)来创建 View

mysql - SQL通过忽略非字母和非数字来删除重复记录

oracle - 比较两个 Oracle 类型的每一列中的值