Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL:创建可更新视图,从表中复制值_Sql_Oracle - Fatal编程技术网

SQL:创建可更新视图,从表中复制值

SQL:创建可更新视图,从表中复制值,sql,oracle,Sql,Oracle,在oracle 12g上,我有一张桌子 CREATE TABLE OLDTABLE ("COLOR" CHAR(3 BYTE) NOT NULL ENABLE, "OBJECT_TYPE" VARCHAR2(8 BYTE) NOT NULL ENABLE); create or replace synonym SYN_TO_OLDTABLE for OLDTABLE; 使用颜色/对象列表,例如“黑色”、“杯形” 我不需要在OLDTABLE中添加行,也不需要复制值,这样所有“黑色”项也都是“绿色

在oracle 12g上,我有一张桌子

CREATE TABLE OLDTABLE ("COLOR" CHAR(3 BYTE) NOT NULL ENABLE, "OBJECT_TYPE" VARCHAR2(8 BYTE) NOT NULL ENABLE);
create or replace synonym SYN_TO_OLDTABLE for OLDTABLE;
使用颜色/对象列表,例如“黑色”、“杯形”

我不需要在OLDTABLE中添加行,也不需要复制值,这样所有“黑色”项也都是“绿色”的,所以我创建了一个视图

create or replace view VW_TO_OLDTABLE as 
   select COLOR, OBJECT_TYPE from OLDTABLE
  UNION
   select 'GRN', OBJECT_TYPE from OLDTABLE where COLOR = 'BLK'
   ;
现在我很高兴,我替换了同义词以显示视图而不是表

create or replace synonym SYN_TO_OLDTABLE for VW_TO_OLDTABLE;
现在我对结果很满意,但我有一个问题。。。问题是我需要视图是可更新的,但是oracle文档说它不能更新,因为视图有一个UNION语句

   insert into SYN_TO_OLDTABLE(COLOR,OBJECT_TYPE)  values ('AAA','BBB');
   commit;
文档和在线研究也建议使用而不是触发器,这是可以的,但我必须对许多其他表(如150)重复相同的过程,有更多的列,我不想创建350个触发器,因为维护起来非常困难(添加/删除列、更改表、更改列等等)

所以。。。问题是:

  • 是否有其他方法可以在不使用UNION语句和不向表中添加行的情况下复制值

谢谢

您的Oracle实例是否设置了分区?是的,我将其用于其他不太相关的表,但是如果您的表不包含绿色,您可以使用
unoall
而不是
UNION
(视图仍然不可更新,但性能会更好)。如果你现在有绿色,你还有其他问题。您还应该添加对更新的期望。如果你将绿色更新为黑色,你会有什么期望?这是一个好问题:我需要插入、更新和删除只坚持BLK项目我有另一个输入。。。我有一张不同的桌子,上面有颜色列表
   insert into SYN_TO_OLDTABLE(COLOR,OBJECT_TYPE)  values ('AAA','BBB');
   commit;