2011-06-09 65 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的東西)。