是否可以在从 2 个表创建的复杂视图中插入新行?

Posted

技术标签:

【中文标题】是否可以在从 2 个表创建的复杂视图中插入新行?【英文标题】:Is possible insert a new row in a complex view created from 2 tables? 【发布时间】:2017-01-28 12:17:32 【问题描述】:

我已经阅读了 Oracle 语言参考并且没有关于这种情况的内容所以我们开始...

我从 2 个表中编写了一个复杂的视图:

CREATE OR REPLACE NOFORCE VIEW vw_emps_hist_50_b
AS
   SELECT employee_id, first_name, last_name, 
          job_id, department_id
   FROM   employees_history
   WHERE  department_id = 50
   UNION
   SELECT employee_id, TO_CHAR(NULL), TO_CHAR(NULL),
          job_id, department_id
   FROM   employees_history_2
   WHERE  department_id = 50
WITH CHECK OPTION;

现在我正在尝试使用视图插入新行:

INSERT INTO vw_emps_hist_50_b
VALUES      (2005, 'Dexter', 'Morgan', 'ST_CLERK', 50);

Error que empieza en la línea: 46 del comando -
INSERT INTO vw_emps_hist_50_b
VALUES      (2005, 'Dexter', 'Morgan', 'ST_CLERK', 50)
Error en la línea de comandos : 46 Columna : 13
Informe de error -
Error SQL: ORA-01732: data manipulation operation not legal on this view
01732. 00000 -  "data manipulation operation not legal on this view"
*Cause:    
*Action:

有没有办法将此行插入两个表中?或者我可以选择要在哪个表中插入这个新行吗?

【问题讨论】:

必须使用“UNION”子句 @GurV 。 . .我更喜欢cast(NULL as varchar2(255)) 或类似的东西。但它会创建一个具有字符数据类型的NULL 值。是的,NULL 可以有一个类型。 (当我尝试使用列中只有 NULL 的查询创建表时,我会定期提醒这一点。) 【参考方案1】:

不,是的。您不能直接插入到视图中;这太复杂了。相反,您可以在视图本身上创建一个“代替”触发器。

也就是说,您可以指定视图更新时要执行的操作。一个开始的地方是 Oracle documentation 关于这个主题。

【讨论】:

天哪,你真是个天才!!!我在 3 或 4 个月前读过关于而不是触发器,但我不记得这个选项了!我将再次阅读触发器。非常感谢你的帮助。过去 8 分钟我会标记你的答案【参考方案2】:

执行的操作违反了政策,因为视图派生自多个表,并且您正在尝试对该视图执行插入操作。

【讨论】:

以上是关于是否可以在从 2 个表创建的复杂视图中插入新行?的主要内容,如果未能解决你的问题,请参考以下文章

MySQL INSERT ... 从 1 个表中选择 2 个表

iPhone SDK:使用新行插入和更新 UITableView

Postgres 检查是不是插入了任何新行

oracle触发器在表中插入新行时更新新的视图行

如何创建不更新旧数据的增量视图?

将新行添加到表后动态创建视图