是否可以在从 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 个表