Разработка программы, обеспечивающую с помощью средств языка С++ ввод анкетных данных студентов и вывод в табличном виде списка студентов, отобранных по заданному условию, страница 9

РЕШЕНИЕ:

Создание триггера:

SQL> edit trig273

При этом автоматически создастся файл trig273.sql, и откроется блокнот для его редактирования. В этот текстовый редактор заносим текст программы:

CREATEORREPLACETRIGGERtrig273

AFTER INSERT OR UPDATE

 ON Dogovor

 REFERENCING OLD AS old_row NEW AS new_row

 FOR EACH ROW

DECLARE

 CountFilms NUMBER;

BEGIN

 IF (INSERTING) THEN

  SELECT kol

  INTO CountFilms

  FROM film

  WHERE filmid=:new_row.filmid;

  IF(CountFilms = 0) THEN

raise_application_error(-20001,'Все кассеты с данным фильмом находятся у клиентов!!!Придётся потерпеть!!!');

END IF;

  UPDATE film

  SET kol=kol-1

  WHERE filmid=:new_row.filmid;

 ELSIF (UPDATING) THEN

  IF (:new_row.vozvrat IS NOT NULL) THEN

   IF (:old_row.vozvrat IS NULL) THEN

    UPDATE film

    SET kol=kol+1

    WHERE filmid=:new_row.filmid;

 END IF;

 END IF;

 END IF;

END;

/

Запуск триггера на выполнение:

SQL> @trig273

Ввод усечен до 1 символов

Триггер создан.

Проверка в словаре данных:

SELECT TRIGGER_NAME, TRIGGER_TYPE, TABLE_NAME, TRIGGERING_EVENT

FROM USER_TRIGGERS

WHERE TRIGGER_NAME = ' trig273'

Проверка работы триггера:

Select * from film;

Insert into dogovor (kod_f, kod_kl, data_vidachi)

values(1,2, ’12.10.09');

select * from film;

Задача №14

ДАНО:

Таблицы реляционной базы данных ORACLE

 

Таблица

Реквизиты

Фильм

Код фильма, название фильма, режиссер, стоимость, количество экземпляров

 

Клиент

Код клиента, адрес, телефон

 

Договор

Код договора, код фильма, код клиента, дата выдачи, дата возврата

 

ТРЕБУЕТСЯ:

1.  Создать триггер, который проверяет возможность вставки в таблицу Договор  новой записи с существующими кодами клиентов и кодами фильмов в таблицах Фильм и Клиент.

2.  В словаре данных проверить наличие и состояние триггера.

3.  Проверить работу триггера.

 

РЕШЕНИЕ:

Создание триггера:

SQL> edit trig271

При этом автоматически создастся файл trig271.sql, и откроется блокнот для его редактирования. В этот текстовый редактор заносим текст программы:

CREATEORREPLACETRIGGERtrig2711

BEFORE INSERT

 ON Dogovor

 REFERENCING NEW as new_row

 FOR EACH ROW

DECLARE

 CountFilm NUMBER;

 CountClient NUMBER;

BEGIN

 SELECT count(filmid)

 INTO CountFilm

 FROM Film

 WHERE Filmid=:new_row.filmid;

 SELECT count(Clientid)

 INTO CountClient

 FROM Client

 WHERE Clientid=:new_row.Clientid;

 IF (CountFilm = 0) THEN

  raise_application_error(-20001,'Данногофильманесуществует!!!');

 ELSIF(CountClient = 0) then

  raise_application_error(-20001,'Данного клиента не существует!!!');

 ENDIF;

END;

/

После сохранения созданного, исполняем этот скрипт из командной строки

Запуск триггера на выполнение:

SQL> @trig2711

Ввод усечен до 1 символов

Триггер создан.

Выполняем проверку работы триггера:

SQL> insertintodogovor

2  values(10,'18.12.2004','',7);

insert into dogovor

*

ошибка в строке 1:

ORA-20001: Данного клиента не существует!!!

ORA-06512: на  "EI0101.TRIG2711", line 19

ORA-04088: ошибка во время выполнения триггера 'EI0101.TRIG2711'

SQL> insert into dogovor

  2  values(12,'18.12.2004','',5);

insert into dogovor

            *

ошибкавстроке 1:

ORA-20001: Данного фильма не существует!!!

ORA-06512: на  "EI0101.TRIG2711", line 17

ORA-04088: ошибка во время выполнения триггера 'EI0101.TRIG2711'

SQL> insert into dogovor

  2  values(10,'18.12.2004','',5);

1 строка создана.