SYBASE (543027), страница 4
Текст из файла (страница 4)
Синтаксис оператора:
waitfor { delay «<время> » | time «<время> » | errorexit | processexit | mirrorexit}
delay сообщает SQL-серверу промежуток времени, в течение которого ему находиться в состоянии ожидания. time сообщает SQL-серверу то же самое время, только в формате данных типа datetime. Для <времени> используется формат «<часы>:<минуты>:<секунды> ».
Примеры:
waitfor delay «01:30»
waitfor time «16:23»
errorexit сообщает SQL-серверу ждать до тех пор, пока процесс не закончится аварийно; processexit заставляет ожидать до тех пор, пока процесс не прервется по какой-либо причине; mirrorexit заставляет ожидать до тех пор, пока не прервется чтение или запись на диске дампирования.
-
Оператор комментариев
Синтаксис:
/* <текст комментария> */
Длина текста комментария не ограничена. Если комментарий занимает несколько строчек, то первая строка начинается с «/*», а последующие с «**», хотя каждую строку можно начинать с «/*», а заканчивать «*/».
Пример:
/* пример сложного запроса */
Использование курсоров
Курсор - это символическое имя, связанное с предложением select через декларативное предложение. Курсор состоит из двух частей: множество результатов курсора и позиция (текущий указатель) курсора. Курсоры используются в тех случаях, когда select - предложение возвращает множество (таблицу) записей, а пользователю необходимо манипулировать каждой записью в отдельности. Используя имя курсора можно выполнять операторы delete или update для каждой записи.
Процесс использования курсора включает в себя следующие шаги:
1) объявление курсора;
2) открытие курсора;
3) выборка одной записи с помощью курсора;
4) обновление или удаление записей с помощью курсора;
5) закрытие курсора;
6) освобождение курсора.
Объявление курсора
declare <имя курсора> cursor for
[for {read only|update [of <список имен колонок>]}]
Открытие курсора
open <имя курсора>
Выборка одной записи с помощью курсора
fetch <имя курсора> [into <выходной список переменных>]
Переменные объявляются в начале процедуры с помощью оператора declare. Имя переменной начинается с @, например: @name, @city, @state.
Результатом работы оператора fetch является код возврата, имеющий одно из трех значений:
0 - fetch выполнен успешно;
1 - ошибочное выполнение fetch;
2 - либо данных по выборке нет, либо данные закончились (указатель курсора на последней записи).
Обновление записей с помощью курсора:
1) - объявление курсора для обновления:
declare <имя курсора> cursor for
for update [of <список имен колонок>]
2) - оператор обновления:
update [[<имя БД>.]<владелец>.]{<имя таблицы>|<имя представления>}
set [[[<имя БД>.]<владелец>.]{<имя таблицы>.|<имя представления>.}]
<имя колонки1>={[выр.1> | NULL | (
[,<имя колонки2>={<выр.2> | NULL | (
where current of <имя курсора>
Удаление записей с помощью курсора
1) - обычное объявление курсора:
declare <имя курсора> cursor for
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 /* закрытие курсора и останов процедуры в случае ошибки */















