Национальный исследовательский университет
Московский Энергетический Институт
Лабораторная работа по курсу БД.
№ 7
Выполнили студенты группы
А-13-08
Апухтин М.А., Асонов А.В.
Проверила Сидорова Н.П.
Цель:
Практически освоить создание и использование сложных (с элементами программирования) хранимых процедур.
Научиться использовать хранимые процедуры для выполнения двумерных и трехмерных статистических запросов.
Задание 1
Выдать статистику по городам и специальностям вашего государства. Очет должен начинаться заголовком и цифрой - общим количеством записей по запросу. Далее совокупность таблиц, где каждая таблица начинается с заголовка: ГОРОД <название> - ВСЕГО <цифра> (где <цифра> не равна нулю), а заканчивается перечнем шифров специальностей с цифрами, не равными нулю.
create procedure zapr8_1 as
declare @gor char (20)
declare @spets char (6)
declare @it1 int
declare @it2 int
declare @itall int
declare @gor1 char (20)
declare y cursor for
select vuz_gorod.nazvanie_goroda, spec, count (*)
from azer join vuz_gorod on vuz_k=cod_vuza
group by vuz_gorod.nazvanie_goroda, spec
select @it2=0
select @itall=0
open y
fetch y into @gor, @spets, @it1
if (@@fetch_status=-2) begin
print 'Ошибка при выполнении первого FETCH'
close y /* закрытие курсора и останов процедуры в случае ошибки */
return
end
if (@@fetch_status=-1) begin
print 'Данные не найдены'
close y /*закрытие курсора и останов процедуры в случае отсутствия данных по запросу */
return
end
select @gor1=@gor
print @spets+' -'+str(@it1)
select @it2=@it2+@it1
select @itall=@itall+@it1 /* подсчет общего итога по запросу */
/* цикл обработки запроса */
while (@@fetch_status=0)
begin
fetch y into @gor, @spets, @it1
if (@gor1 !=@gor) begin
print 'Город ' + @gor1 + ' - ' +str(@it2)
select @gor1=@gor
select @it2=0
end
if (@@fetch_status=-1) break /* при окончании данных немедленный выход из цикла */
print @spets + ' - ' +str(@it1)
select @it2=@it2+@it1
select @itall=@itall+@it1
end
close y /* закрытие курсора по окончании цикла */
if (@@fetch_status=-2) begin
print 'Ошибка при выполнении FETCH'
return /* останов процедуры в случае ошибки */
end
print 'Город ' + @gor + ' - ' +str(@it2)
print '___________________________________'
print 'Всего по запросу -'+str(@itall) /*печать общего итога по запросу */
deallocate y /* освобождение курсора */
return
Задание 2
Выдать статистику по городам и учебным заведениям вашего государства. Отчет должен начинаться соответствующим заголовком. Далее должна следовать совокупность таблиц, каждая из которых включает перечень учебных заведений одного города с цифрами, не равными нулю (последняя строка таблицы представляет собой:ГОРОД <название> - ВСЕГО <цифра>, где <цифра> не равна 0). Заканчивается отчет цифрой - общим количеством записей по запросу.
create procedure zapr8_2 as
declare @gor char (20)/*переменная для названия города*/
declare @yz char (25)/*переменная для названия учебного заведения*/
declare @it1 int/*переменная для итога по полю название учебного заведения*/
declare @it2 int/*переменная для итога по полю название города*/
declare @itall int/*переменная для итога по всему запросу*/
declare @gor1 char (20)/*переменная для названия города*/
declare y cursor for
select vuz_gorod.nazvanie_goroda,vuz_gorod.nazvanie_vuza,count(*)
from azer join vuz_gorod on vuz_k=vuz_gorod.cod_vuza
where vuz_gorod.nazvanie_stran like 'АЗЕРБАЙДЖАН%'
group by vuz_gorod.nazvanie_goroda,vuz_gorod.nazvanie_vuza
select @it2=0
select @itall=0
open y
fetch y into @gor,@yz,@it1
if(@@fetch_status=-2) begin
print 'Ошибка при выполнении первого FETCH'
close y
return
end
if(@@fetch_status=-1) begin
print 'Данные не найдены'
close y
return
end
select @gor1=@gor
print @yz+' - '+str(@it1)
select @it2=@it2+@it1
select @itall=@itall+@it1
while (@@fetch_status=0)
begin
fetch y into @gor,@yz,@it1
if (@gor1!=@gor) begin
print 'город '+@gor1+' - '+str(@it2)
select @gor1=@gor
select @it2=0
end
if(@@fetch_status=-1) break
print @yz+' - '+str(@it1)
select @it2=@it2+@it1
select @itall=@itall+@it1
end
close y
if(@@fetch_status=-2) begin
print 'Ошибка при выполнении FETCH'
return
end
print 'город '+@gor+' - '+str(@it2)
print '-----------------------------------------'
print 'всего по запросу- '+str(@itall)
deallocate y
return