更新视图

时间:2011-06-09 18:29:16

标签: sql oracle

我有以下视图,我正在尝试更新视图。显示错误:“此处不允许虚拟列”。我怎么安排这个?

由于 Keith 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:

3 个答案:

答案 0 :(得分:5)

您的视图包含一个虚拟列Actor_FullName,它是另外两个真实列的串联。

您只能更新符合特定条件的视图,或者具有关联的INSTEAD OF触发器。请在PSOUG.org.

了解详情

答案 1 :(得分:4)

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

视图中的ACTOR_FULLNAME列是两个基列和一个文字的串联。 Oracle无法通过更新该列来了解您的意思。它应该更改ACTOR.ACTOR_NAME,ACTOR.ACTOR_SURNAME还是两者都有?如果虚拟列的表达式总是包含空格,它如何以更新后正常运行的方式更新其中一个或两个?

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

答案 2 :(得分:0)

您正在尝试像表格一样更新视图。这是不可能的 - 您需要改变视图的定义。我从未使用过Oracle,但在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)。