Обновление представления - PullRequest
1 голос
/ 09 июня 2011

У меня есть вид ниже, и я пытаюсь обновить вид. Ошибка: "виртуальный столбец здесь не разрешен" отображается. Как мне это устроить?

Спасибо Кит Спитери

Вид:

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 ]

5 голосов
/ 09 июня 2011

Ваше представление содержит виртуальный столбец Actor_FullName, который является объединением двух других реальных столбцов.

Вы можете обновлять только те представления, которые соответствуют определенным критериям или имеют связанный триггер INSTEAD OF.Узнайте больше об этом на PSOUG.org.

4 голосов
/ 09 июня 2011

Представление - это просто сохраненный запрос - когда вы обновляете его, необходимо изменить базовые таблицы. Как можно обновить столбец представления, созданный с помощью комбинации нескольких базовых столбцов?

Столбец ACTOR_FULLNAME в представлении представляет собой объединение двух базовых столбцов и литерала. У Oracle нет возможности узнать, что вы имеете в виду, обновляя этот столбец. Должен ли он изменить ACTOR.ACTOR_NAME, ACTOR.ACTOR_SURNAME или оба? И как он может обновлять одно или оба так, чтобы они работали правильно после обновления, если выражение для виртуального столбца всегда содержит пробел?

Если у вас есть какая-то значимая логика, которую вы хотите реализовать для обработки такого ОБНОВЛЕНИЯ, вы можете использовать триггер INSTEAD OF в представлении для его реализации.

0 голосов
/ 09 июня 2011

Вы пытаетесь обновить представление так же, как таблицу. Это невозможно - вам нужно вместо этого изменить определение представления. Я никогда не использовал 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).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...