лаба14БД
.docМинистерство образования и науки РФ
РГРТУ
Кафедра ЭВМ
Отчет
о лабораторной работе №14
«Использование курсоров в хранимых
процедурах и триггерах»
Выполнили:
Ст.гр. 048 (бр.6)
Перунова Е.
Шумилова А.
Проверили:
Громов А.Ю.
Рязань, 2012 г.
1. Изучение операторов создания и управления курсорами. Использование курсоров в теле триггеров.
1.1. Создать представление с информацией о выдаче книг на руки. Представление должно включать столбцы Номер читательского билета, Фамилия абонента, Шифр книги, Название книги, Дата выдачи, Срок возврата, Размер штрафа за утерю книги.
CREATE VIEW V10
AS
SELECT ЧитБилет, Фамилия, Шифр, Название, ДатаВыдачи, СрокВозврата, Штраф
FROM (Абоненты INNER JOIN ВыдачаКниг ON Абоненты.ЧитБилет=ВыдачаКниг.Абонент)
INNER JOIN Книги ON Книги.Шифр=ВыдачаКниг.Книга
GO
Проверка:
SELECT *
FROM V10
1.2. Разработать триггер, который позволяет вносить информацию о выдаче книг через представление. Считать, что пользователю предоставляется возможность вставки множества записей в таблицу. Предусмотреть вывод сообщения об ошибке в случае ввода наименований несуществующего абонента или книги.
CREATE TRIGGER T100
ON V10
INSTEAD OF INSERT
AS
DECLARE @bilet int ,
@familia nchar(30) ,
@shifr int ,
@nazvanie nchar(30),
@datavyd datetime,
@srokvoz datetime,
@shtraf money
DECLARE C1 CURSOR scroll
FOR
SELECT ЧитБилет, Фамилия, Шифр, Название,ДатаВыдачи, СрокВозврата, Штраф
FROM inserted
OPEN C1
FETCH FIRST FROM C1
INTO @bilet, @familia, @shifr, @nazvanie, @datavyd, @srokvoz, @shtraf
WHILE @@FETCH_STATUS = 0
BEGIN
IF NOT EXISTS ( SELECT *
FROM Абоненты
WHERE ЧитБилет = @bilet AND Фамилия = @familia )
PRINT 'Такого абонента не существует'
ELSE
IF NOT EXISTS ( SELECT *
FROM Книги
WHERE Шифр = @shifr AND Название = @nazvanie ) PRINT 'Такой книги не существует'
ELSE
INSERT ВыдачаКниг
VALUES (@bilet, @shifr, @datavyd, @srokvoz, @shtraf)
FETCH NEXT FROM C1
INTO @bilet, @familia, @shifr, @nazvanie, @datavyd, @srokvoz, @shtraf
END
CLOSE C1
DEALLOCATE C1
GO
Проверка:
INSERT V10
VALUES (1, 'Книголюбов', 8, 'Муму', cast('2009-09-03' as datetime), cast('2009-09-20' as datetime), 100)
2. Изучение операторов создания и управления курсорами. Использование курсоров в теле хранимых процедур.
2.1. Написать хранимую процедуру, которая позволяет вывести информацию обо всех книгах в следующем виде.
Книга: «Война и мир»
Петров П.П. 1
Иванов И.И. 2
Общее количество выдачи на руки: 3
CREATE PROCEDURE P100
AS
DECLARE @shifr int, @nazvanie char(30), @familia char (30), @vydana int
DECLARE C2 CURSOR scroll
FOR
SELECT Книги.Шифр, Книги.Название
FROM Книги JOIN ВыдачаКниг ON Книги.Шифр = ВыдачаКниг.Книга
GROUP BY Шифр, Название
OPEN C2
FETCH FIRST FROM C2
INTO @shifr, @nazvanie
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT ''
PRINT 'Книга: ' + @nazvanie
DECLARE C3 CURSOR scroll
FOR
SELECT Абоненты.Фамилия, count(ВыдачаКниг.Книга)
FROM Абоненты, ВыдачаКниг
WHERE Абоненты.ЧитБилет = ВыдачаКниг.Абонент AND ВыдачаКниг.Книга = @shifr
GROUP BY Абоненты.Фамилия
OPEN C3
FETCH NEXT FROM C3
INTO @familia, @vydana
WHILE @@FETCH_STATUS=0
BEGIN
PRINT ' ' + RTRIM(@familia) + ' ' + RTRIM(@vydana)
FETCH NEXT FROM C3
INTO @familia, @vydana
END
CLOSE C3
DEALLOCATE C3
SELECT @vydana = count(Книга)
FROM ВыдачаКниг
WHERE ВыдачаКниг.Книга = @shifr
PRINT ' Общее количество выдачи на руки: ' + RTRIM(@vydana)
FETCH NEXT FROM C2
INTO @shifr, @nazvanie
END
CLOSE C2
DEALLOCATE C2
GO
EXECUTE P100