【问题标题】:Is possible insert a new row in a complex view created from 2 tables?是否可以在从 2 个表创建的复杂视图中插入新行?
【发布时间】: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 的查询创建表时,我会定期提醒这一点。)

标签: sql oracle view union sql-insert


【解决方案1】:

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

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

【讨论】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-03
    • 1970-01-01
    • 2017-08-08
    • 1970-01-01
    • 2022-12-02
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多