Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

лаба14БД

.doc
Скачиваний:
36
Добавлен:
15.04.2015
Размер:
49.66 Кб
Скачать

Министерство образования и науки РФ

РГРТУ

Кафедра ЭВМ

Отчет

о лабораторной работе №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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]