我有以下视图,我正在尝试更新视图。显示错误:“此处不允许虚拟列”。我怎么安排这个?
由于 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:
答案 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)。