2011-06-09 100 views
1

我有下面的视图,我试图更新视图。错误:“虚拟列不允许在这里”正在显示。我该如何安排?更新视图

感谢 基思Spiteri的

查看:

CREATE OR REPLACE VIEW FilmDetailsView 
    (Film_Name, Actor_FullName, Hall_Number, Date_Time) 
AS SELECT flm.film_name, actor.actor_name || ' ' || actor.actor_surname, 
    hall.cinemahall_number, schedule.schedule_date 
FROM film flm 
JOIN movieschedule schedule 
ON (flm.film_id = schedule.schedule_filmid) 
JOIN cinemahall hall 
ON (schedule.schedule_hallid = hall.cinemahall_id) 
JOIN FilmActor filmactor 
ON (flm.film_id = filmactor.filmactor_filmid) 
JOIN Actor actor 
ON (actor.actor_id = filmactor.filmactor_actorid); 

更新:

UPDATE FILMDETAILSVIEW 
SET ACTOR_FULLNAME = 'a' 
WHERE HALL_NUMBER = 1; 

的错误:

Error starting at line 312 in command: 
UPDATE FILMDETAILSVIEW 
SET ACTOR_FULLNAME = 'a' 
WHERE HALL_NUMBER = 1 
Error at Command Line:313 Column:4 
Error report: 
SQL Error: ORA-01733: virtual column not allowed here 
01733. 00000 - "virtual column not allowed here" 
*Cause:  
*Action: 
+4

您希望Oracle在哪里存储数据? – 2011-06-09 18:34:16

+0

@Álvaro - +1 - 也许期望的是Oracle会“神奇地拉开全名的名字”...... :) – 2011-06-09 18:36:13

+0

它可以是hall_number ..仍然不起作用 – Mark 2011-06-09 18:42:40

回答

4

视图只是一个存储的查询 - 当你通过它更新时,它是必须修改的基础表。如何更新通过多个基本列的组合生成的视图列?

视图中的ACTOR_FULLNAME列是两个基本列和一个文字的串联。 Oracle无法通过更新该列来了解您的意思。是否应更改ACTOR.ACTOR_NAME,ACTOR.ACTOR_SURNAME或两者?考虑到虚拟列的表达式总是包含一个空格,那么它如何以更新后的行为正确的方式更新其中之一或两者?

如果你想要实现一些有意义的逻辑来处理这种UPDATE,你可以在视图上使用INSTEAD OF触发器来实现它。

+0

无需触发器进行更新的条件。我正在跟踪笔记,更新视图时没有触发器。 – Mark 2011-06-09 19:10:31

+1

@标注什么? – 2011-06-09 19:32:55

+0

oracle notes ... – Mark 2011-06-09 20:06:41

5

您的视图包含虚拟Ç olumn Actor_FullName,它是两个其他实列的串联。

您只能更新符合特定条件的视图或具有关联的INSTEAD OF触发器。阅读更多关于此的在PSOUG.org.

+0

它可以是hall_number ..仍然不起作用 – Mark 2011-06-09 18:42:45

+1

无论您试图更新哪些列,视图都包含虚拟列,并且不可更新为书面形式。您需要在视图上使用INSTEAD OF触发器才能更新它。 – DCookie 2011-06-09 18:46:02

+0

不需要触发器。我正在跟踪笔记,更新视图时没有触发器。 – Mark 2011-06-09 19:11:23

0

您正在尝试像更新表格一样更新视图。这是不可能的 - 你需要改变视图的定义。我从来没有使用甲骨文,但在SQL Server中,你可以使用一个case语句,像这样:

case hall.cinemahall_number when 1 then 'a' 
    else actor.actor_name + ' ' + actor.actor_surname 
end as actor_fullname 

可能会包含在您的视图的定义,那就是你有

actor.actor_name || ' ' || actor.actor_surname 

现在。 (显然转换我写给PL/SQL的东西)。