Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
48
Добавлен:
28.06.2014
Размер:
1.21 Mб
Скачать

МОСКОВСКИЙ ЭНЕРГЕТИЧЕСКИЙ ИНСТИТУТ (ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ)

ИНСТИТУТ АВТОМАТИКИ И ВЫЧИСЛИТЕЛЬНОЙ ТЕХНИКИ

КАФЕДРА ПРИКЛАДНОЙ МАТЕМАТИКИ

Лабораторная работа № 8.

Создание и использование сложных хранимых процедур.

Выполнили

студенты группы А-13-08

каф. Прикладной Математики

Буренков Сергей

Захаров Антон

Москва, 2011

Задание 1

Выдать статистику по городам и специальностям вашего государ­ства. Отчёт должен начинаться заголовком и цифрой – общим количеством записей по запросу. Далее совокупность таблиц, где каждая таблица на­чинается с заголовка: ГОРОД <название> - ВСЕГО <цифра> (где <цифра> не равна нулю), а заканчивается перечнем шифров специальностей с циф­рами, не равными нулю.

Запрос:

CREATE PROCEDURE fetch_check (@number CHAR(1) = '1') AS

BEGIN

IF(@@fetch_status = -2)

BEGIN

PRINT 'Ошибка при выполнении FETCH (' + str(@number) + ')'

RETURN 1

END

IF(@@fetch_status = -1)

BEGIN

PRINT 'Данные не найдены при выполнении FETCH (' + str(@number) + ')'

RETURN 1

END

RETURN 0

END

CREATE PROCEDURE lab8_p1 (@total INT OUTPUT) AS

BEGIN

DECLARE @g1 CHAR(20), @g2 CHAR(20), @sp CHAR(6), @it1 INT, @it2 INT, @r INT

SET @r = (SELECT count(*) FROM arm)

SET @total = @r

PRINT 'Всего учащихся: ' + ltrim(str(@r))

DECLARE cur CURSOR FOR

SELECT nazvanie_goroda, count(*)

FROM arm

JOIN vuz_gorod ON vuz_gorod.cod_vuza = vuz_k

GROUP BY nazvanie_goroda

ORDER BY nazvanie_goroda

OPEN cur

FETCH cur INTO @g1, @it1

EXECUTE @r = fetch_check

IF(@r = 1)

BEGIN

CLOSE cur

RETURN

END

DECLARE cur2 CURSOR FOR

SELECT nazvanie_goroda, spec, count(*)

FROM arm

JOIN vuz_gorod ON vuz_gorod.cod_vuza = vuz_k

GROUP BY nazvanie_goroda, spec

ORDER BY nazvanie_goroda, spec

OPEN cur2

FETCH cur2 INTO @g2, @sp, @it2

EXECUTE @r = fetch_check

IF(@r = 1)

BEGIN

CLOSE cur2

RETURN

END

PRINT ''

PRINT rtrim(@g1) + ' - ' + ltrim(str(@it1))

PRINT '---------------------'

PRINT @sp + ' - ' + ltrim(str(@it2))

WHILE(@@fetch_status = 0)

BEGIN

FETCH cur2 INTO @g2, @sp, @it2

WHILE(@g1 != @g2)

BEGIN

FETCH cur INTO @g1, @it1

PRINT ''

PRINT @g1 + ' - ' + ltrim(str(@it1))

PRINT '---------------------'

PRINT @sp + ' - ' + ltrim(str(@it2))

FETCH cur2 INTO @g2, @sp, @it2

END

IF(@@fetch_status = -1) BREAK

PRINT @sp + ' - ' + ltrim(str(@it2))

END

CLOSE cur

DEALLOCATE cur

CLOSE cur2

DEALLOCATE cur2

RETURN

END

Результат:

DECLARE @total INT

EXECUTE lab8_p1 @total OUTPUT

PRINT ''

PRINT 'Значение выходного параметра = ' + ltrim(str(@total))

Задание 2

Выдать статистику по городам и учебным заведениям вашего госу­дарства. Отчёт должен начинаться соответствующим заголовком. Далее должна следовать совокупность таблиц, каждая из которых включает пе­речень учебных заведений одного города с цифрами, не равными нулю (последняя строка таблицы представляет собой: ГОРОД <название> - ВСЕГО <цифра>, где <цифра> не равна 0). Заканчивается отчёт цифрой - общим коли­чеством записей по запросу.

Запрос:

CREATE PROCEDURE lab8_p2 AS

BEGIN

DECLARE @g1 CHAR(20), @g2 CHAR(20), @vuz CHAR(25), @it1 INT, @it2 INT, @r INT

DECLARE cur CURSOR FOR

SELECT nazvanie_goroda, count(*)

FROM arm

JOIN vuz_gorod ON vuz_gorod.cod_vuza = vuz_k

GROUP BY nazvanie_goroda

ORDER BY nazvanie_goroda

OPEN cur

FETCH cur INTO @g1, @it1

EXECUTE @r = fetch_check

IF(@r = 1)

BEGIN

CLOSE cur

RETURN

END

DECLARE cur2 CURSOR FOR

SELECT nazvanie_goroda, nazvanie_vuza, count(*)

FROM arm

JOIN vuz_gorod ON vuz_gorod.cod_vuza = vuz_k

GROUP BY nazvanie_goroda, nazvanie_vuza

ORDER BY nazvanie_goroda, nazvanie_vuza

OPEN cur2

FETCH cur2 INTO @g2, @vuz, @it2

EXECUTE @r = fetch_check

IF(@r = 1)

BEGIN

CLOSE cur2

RETURN

END

PRINT @vuz + ' - ' + ltrim(str(@it2))

WHILE(@@fetch_status = 0)

BEGIN

FETCH cur2 INTO @g2, @vuz, @it2

WHILE(@g1 != @g2)

BEGIN

PRINT '---------------------'

PRINT rtrim(@g1) + ' - ' + ltrim(str(@it1))

PRINT ''

FETCH cur INTO @g1, @it1

PRINT @vuz + ' - ' + ltrim(str(@it2))

FETCH cur2 INTO @g2, @vuz, @it2

END

IF(@@fetch_status = -1) BREAK

PRINT @vuz + ' - ' + ltrim(str(@it2))

END

PRINT '---------------------'

PRINT rtrim(@g1) + ' - ' + ltrim(str(@it1))

CLOSE cur

DEALLOCATE cur

CLOSE cur2

DEALLOCATE cur2

PRINT ''

SET @r = (SELECT count(*) FROM arm)

PRINT 'Всего учащихся: ' + ltrim(str(@r))

RETURN

END

Результат: