МОСКОВСКИЙ ЭНЕРГЕТИЧЕСКИЙ ИНСТИТУТ (ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ)
ИНСТИТУТ АВТОМАТИКИ И ВЫЧИСЛИТЕЛЬНОЙ ТЕХНИКИ
КАФЕДРА ПРИКЛАДНОЙ МАТЕМАТИКИ
Лабораторная работа № 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
Результат: