SYBASE (988809), страница 10
Текст из файла (страница 10)
2) - оператор обновления:
update [[<имя БД>.]<владелец>.]{<имя таблицы>|<имя представления>}
set [[[<имя БД>.]<владелец>.]{<имя таблицы>.|<имя представления>.}]
<имя колонки1>={[выр.1> | NULL | (<select-предложение>)}
[,<имя колонки2>={<выр.2> | NULL | (<select-предложение>)}]...
where current of <имя курсора>
Удаление записей с помощью курсора
1) - обычное объявление курсора:
declare <имя курсора> cursor for <select-предложение>
2) - оператор удаления:
delete [from][[<имя БД>.]<владелец>.]{<имя таблицы>|<имя представления>}
where current of <имя курсора>
Закрытие курсора:
close <имя курсора>
Освобождение курсора:
deallocate cursor <имя курсора>
Пример использования курсора:
Выдать статистические данные по медицинским специальностям студентов России (0401¸0405) и общую цифру по этим специальностям.
declare @sp char(6) /* переменная для шифра специальности */
declare @it1 int /* переменная для итога по специальности 0401 */
declare @it2 int /* переменная для итога по специальности 0402 */
declare @it3 int /* переменная для итога по специальности 0403 */
declare @it4 int /* переменная для итога по специальности 0404 */
declare @it5 int /* переменная для итога по специальности 0405 */
declare @itall int /* переменная для итога по всему запросу */
/* объявление курсора для одномерного статистического запроса */
declare y cursor for select spec from poss
where spec between '000401' and '000405'
select @it1=0 /* начальное значение итога по по специальности 0401 = 0 */
select @it2=0 /* начальное значение итога по по специальности 0402 = 0 */
select @it3=0 /* начальное значение итога по по специальности 0403 = 0 */
select @it4=0 /* начальное значение итога по по специальности 0404 = 0 */
select @it5=0 /* начальное значение итога по по специальности 0405 = 0 */
select @itall=0 /* начальное значение итога по запросу = 0 */
open y /* открытие курсора */
fetch y into @sp /* считывание первого значения по полю специальность */
if (@@sqlstatus=1) begin
select "Ошибка при выполнении fetch'
close y /* закрытие курсора и останов процедуры в случае ошибки */
return
end
if (@@sqstatus=2) begin
select "Данные не найдены"
close y /* закрытие курсора и останов процедуры в случае отсутствия данных */
return /* по запросу */
end
/* цикл обработки запроса */
while (@@sqlstatus=0) begin
if (@sp='000401') begin
select @it1=@it1+1 /* подсчет итога по специальности 0401 */
select @itall=@itall+1 /* подсчет общего итога по запросу */
end
if (@sp='000402') begin
select @it2=@it2+1 /* подсчет итога по специальности 0402 */
select @itall=@itall+1 /* подсчет общего итога по запросу */
end
if (@sp='000403') begin
select @it3=@it3+1 /* подсчет итога по специальности 0403 */
select @itall=@itall+1 /* подсчет общего итога по запросу */
end
if (@sp='000404') begin
select @it4=@it4+1 /* подсчет итога по специальности 0404 */
select @itall=@itall+1 /* подсчет общего итога по запросу */
end
if (@sp='000405') begin
select @it5=@it5+1 /* подсчет итога по специальности 0405 */
select @itall=@itall+1 /* подсчет общего итога по запросу */
end
fetch y into @sp /* считывание очередного значения по полю специальность */
end
if (@@sqlstatus=1) begin
select "Ошибка при выполнении fetch"
close y /* закрытие курсора и останов процедуры в случае ошибки */
return
end
close y /* закрытие курсора по окончании цикла */
deallocate cursor y /* освобождение курсора */
select "000401", @it1 /* печать итога по специальности 0401*/
select "000402", @it2 /* печать итога по специальности 0402*/
select "000403", @it3 /* печать итога по специальности 0403*/
select "000404", @it4 /* печать итога по специальности 0404*/
select "000405", @it5 /* печать итога по специальности 0405*/
select "Общий итог", @itall /* печать общего итога по запросу */
return
Примеры хранимых процедур для выполнения двумерных и трехмерных статистических запросов:
-
выдать статистику по всем учебным заведениям и категориям обучения учащимся России, принятых на учебу в 1990 году.
create procedure zapr6 as
select vuz.uch_zavedenie, kat_obuch.kat_obucheniya,
count (*)
from poss, vuz, kat_obuch
where gp='90' and vuz_k=vyz.cod
and kat_obuch_k=kat_obuch.cod
group by vuz.uch_zavedenie, kat_obuch.k_obucheniya
-
выдать статистику по всем учебным заведениям, специальностям и категориям обучения учащихся России.
create procedure zapr7 as
select vuz.uch_zavedenie, spec, kat_obuch.kat_obucheniya,
count (*)
from poss, vuz, kat_obuch
where vuz_k=vuz.cod and kat_obuch_k=kat_obuch.cod
group by vuz.uch_zavedenie, spec, kat_obuch.kat_obucheniya
Отчеты по сформулированным запросам имеют ограниченный вид и не вполне удовлетворяют пользователя. Для исправления этого необходимо использовать программирование в хранимых процедурах (процедуры zapr8 и zapr9).
create procedure zapr8 as
declare @yz char (25) /* переменная для названия учебного заведения */
declare @ko char (16) /* переменная для названия категории обучения */
declare @it1 int /* переменная для итога по полю категория обучения */
declare @it2 int /* переменная для итога по полю учебное заведение */
declare @itall int /* переменная для итога по всему запросу */
declare @yz1 char (25) /* переменная для названия учебного заведения */
/* объявление курсора для двумерного статистического запроса */
declare y cursor for
select vuz.uch_zavedenie, kat_obuch.kat_obucheniya,
count (*)
from poss, vuz, kat_obuch
where gp='90' and vuz_k=vuz.cod
and kat_obuch_k=kat_obuch.cod
group by vuz.uch_zavedenie, kat_obuch.kat_obucheniya
select @it2=0 /* начальное значение итога по полю учебное заведение = 0 */
select @itall=0 /* начальное значение итога по запросу = 0 */
open y /* открытие курсора */
fetch y into @yz, @ko, @it1 /* считывание первого итога по полю категория обучения */
if (@@sqlstatus=1) begin
select "Ошибка при выполнении первого FETCH"
close y /* закрытие курсора и останов процедуры в случае ошибки */
return
end
if (@@sqlstatus=2) begin
select "Данные не найдены"
close y /* закрытие курсора и останов процедуры в случае отсутствия данных */
return /* по запросу */
end
select @yz1=@yz /* запоминание названия учебного заведения в @yz1 */
select @ko," - ", @it1 /* печать названия категории обучения и итога */
select @it2=@it2+@it1 /* подсчет итога по полю учебное заведение */
select @itall=@itall+@it1 /* подсчет общего итога по запросу */
/* цикл обработки запроса */
while (@@sqlstatus=0)
begin
fetch y into @yz, @ko, @it1 /* считывание очередного итога по полю категория обучения */
if (@yz1 !=@yz) begin /* если название учебного заведения поменялось, то печать */
select "учебное заведение", @yz1, " - ", @it2 /* старого названия учебного заведения и итога */
select @yz1=@yz /* присвоение нового названия учебного заведения */
select @it2=0 /* новый итог = 0 */
end
if (@@sqlstatus=2) break /* при окончании данных немедленный выход из цикла */
select @ko, " - ", @it1 /* печать очередных названия категории обучения и итога */
select @it2=@it2+@it1 /* подсчет итога по полю учебное заведение */
select @itall=@itall+@it1 /* подсчет общего итога по запросу */
end
close y /* закрытие курсора по окончании цикла */
if (@@sqlstatus=1) begin
select "Ошибка при выполнении FETCH"
return /* останов процедуры в случае ошибки */
end
select "учебное заведение ", @yz, - ", @it2 /* печать последнего итога по учебному заведению */
select "всего по запросу - ", @itall /* печать общего итога по запросу */
deallocate cursor y /* освобождение курсора */
return
create procedure zapr9 as
declare @yz char (25) /* переменная для названия учебного заведения */
declare @sp char (6) /* переменная для шифра специальности */
declare @ko char (16) /* переменная для названия категории обучения */
declare @it1 int /* переменная для итога по полю категория обучения */
declare @it2 int /* переменная для итога по полю специальность */
declare @it3 int /* переменная для итога по полю учебное заведение */
declare @itall int /* переменная для итога по всему запросу */
declare @yz1 char (25) /* переменная для названия учебного заведения */
declare @sp1 char (6) /* переменная для шифра специальности */
/* объявление курсора для трехмерного статистического запроса */
declare y cursor for
select vuz.uch_zavedenie, spec,
kat_obuch.kat_obucheniya, count (*)
from poss, vuz, kat_obuch
where go='94' and vuz_k=vuz.cod
and kat_obuch_k=kat_obuch.cod
group by vuz.uch_zavedenie, spec, kat_obuch. kat_obucheniya
select @it2=0 /* начальное значение итога по полю специальность = 0 */
select @it3=0 /* начальное значение итога по полю учебное заведение = 0 */
select @itall=0 /* начальное значение итога по запросу = 0 */
open y /* открытие курсора */
fetch y into @yz, @sp, @ko, @it1 /* считывание первого итога по полю категория обучения */
if (@@sqlstatus=1) begin
select "Ошибка при выполнении первого FETCH"
close y /* закрытие курсора и останов процедуры в случае ошибки */
return
end
if (@@sqlstatus=2) begin
select "Данные не найдены"
close y /* закрытие курсора и останов процедуры в случае отсутствия данных */
return /* по запросу */
end
select @yz1=@yz /* запоминание названия учебного заведения в @yz1 */
select @sp1=@sp /* запоминание шифра специальности в @sp1 */
select @ko, " - ", @it1 /* печать названия категории обучения и итога */
select @it2=@it2+@it1 /* подсчет итога по полю специальность */
select @it3=@it3+@it1 /* подсчет итога по полю учебное заведение */
select @itall=@itall+@it1 /* подсчет общего итога по запросу */
/* цикл обработки запроса */
while (@@sqlstatus=0) begin
fetch y into @yz, @sp, @ko, @it1 /* считывание очередного итога по полю категория */
/* обучения */
if (@yz1!=@yz) begin /* если название учебного заведения поменялось, то печать */
select "учебное заведение ", @yz1, " - ", @it3 /* старого названия учебного заведения и итога */
select @yz1=@yz /* присвоение нового названия учебного заведения */
select @it3=0 /* новый итог = 0 */
end
if (@sp1!=@sp) begin /* если шифр специальности поменялся, то печать */
select "специальность ", @sp1, " - ", @it2 /* старого шифра специальности и итога */
select @sp1=@sp /* присвоение нового шифра специальности */
select @it2=0 /* новый итог = 0 */
end
if (@@sqlstatus=2) break /* при окончании данных немедленный выход из цикла */
select @ko, " - ", @it1 /* печать очередных названия категории обучения и итога */
select @it2=@it2+@it1 /* подсчет итога по полю специальность */
select @it3=@it3+@it1 /* подсчет итога по полю учебное заведение */
select @itall=@itall+@it1 /* подсчет общего итога по запросу */
end
close y /* закрытие курсора по окончании цикла */
if (@@sqlstatus=1) begin