Написание сложного триггера уровня строки В Oracle - PullRequest
0 голосов
/ 12 марта 2020

Мне нужно создать триггер уровня строки для таблицы с именем Movies, которая будет вычислять пять величайших оценок mov ie из этой таблицы Movies, и вставить новую таблицу с именем TopMovies с этими фильмами. Каждый раз, когда я помещаю новый рейтинг в таблицу фильмов, срабатывает этот триггер. Я действительно изо всех сил пытаюсь понять, как go об этом.

Таблица Movies имеет следующие атрибуты (Mov ie, Director, Rating) Таблица Top Movies будет иметь (Rating)

Пока у меня есть только следующий код. Я действительно растерялся относительно того, как сделать так, чтобы после того, как я вставил по крайней мере 5 оценок в таблицу фильмов, таблица TopMovies удалит mov с самым низким рейтингом ie и заново заполнит его новым mov ie. Я не прошу ответа, но помогаю go в правильном направлении

Create of replace Trigger top_trigger
After insert or update on Movies
For each row

Begin
   insert into TopMovies values (:new.rating),
End

Ответы [ 2 ]

2 голосов
/ 12 марта 2020

Вы можете использовать следующее triggers. Но имейте в виду, что одновременные запросы могут изменить ожидаемое поведение при использовании триггеров.

Решение триггера:

CREATE OR REPLACE TRIGGER TOP_TRIGGER AFTER
    INSERT OR UPDATE ON MOVIES
    FOR EACH ROW
DECLARE
    LV_CNT      NUMBER := 0;
    LV_RATING   TOPMOVIES.RATING%TYPE;
BEGIN
    SELECT COUNT(1), MIN(RATING)
      INTO LV_CNT, LV_RATING
      FROM TOPMOVIES;

    IF LV_CNT >= 5 AND :NEW.RATING > LV_RATING THEN
        DELETE FROM TOPMOVIES WHERE RATING = LV_RATING;
    END IF;

    IF LV_CNT < 5 OR ( LV_CNT >= 5 AND :NEW.RATING > LV_RATING ) THEN
        INSERT INTO TOPMOVIES VALUES ( :NEW.RATING );
    END IF;

END;
/

Лучшим решением является использование представления.

ПРОСМОТР РЕШЕНИЯ:

CREATE OR REPLACE VIEW TOPMOVIES_VW AS
    SELECT * FROM
        (
            SELECT T.*,
                   DENSE_RANK() OVER( ORDER BY RATING DESC) AS RANK#
              FROM MOVIES T
        )
    WHERE RANK# <= 5;

Приветствия !!

0 голосов
/ 12 марта 2020

Вы можете попробовать код ниже -

Create of replace Trigger top_trigger
After insert or update on Movies
Declare
    v_movie_count  number:= 0;
Begin
    select count(*)
    into v_movie_count
    from Movies;

    if v_movie_count >= 5 then

       delete from TopMovies;

       INSERT INTO TopMovies
       SELECT *
       FROM (SELECT Rating, ROWNUM RN
             FROM Movies
             ORDER BY Rating)
       WHERE RN <= 5;
       /* You can use below statement if you are using 12C or higher*/
       /*INSERT INTO TopMovies
         SELECT Rating, ROWNUM RN
         FROM Movies
         ORDER BY Rating DESC
         FETCH FIRST 5 ROWS ONLY;*/
    end if;
End
...