06.01.2013, 19:31
общий
это ответ
Здравствуйте, pavell!
Курсоры используются, в основном, в хранимых процедурах, а также в триггерах и скриптах.
Курсор может задаваться в двух режимах – последовательном и скроллирующем.
Последовательный курсор позволяет просматривать только в последовательном порядке с использованием инструкции FETCH NEXT.
При открытии курсора с параметром SCROLL можно использовать полные возможности управления курсором - перемещение и произвольная выборка с использованием инструкции FETCH с различными параметрами:
NEXT – выбирает следующую строку
PREVIOUS ( PRIOR ) – выбирает предыдущую строку
FIRST – выбирает первую строку
LAST – выбирает последнюю строку
CURRENT – выбирает текущую строку ( выбранную ранее )
RELATIVE – выбирает строку, смещенную относительно текущей
ABSOLUTE – выбирает строку с указанным номером ( нумерация с 1 )
Выбранная строка становится текущей.
В случае успешной выборки значений в переменной @@FETCH_STATUS содержится значение 0.
Для отбора номеров изделий, использующих по крайней мере одну деталь, поставляемую поставщиком S1, добавляем в процедуру следующий код:
--объявляем переменную, куда будем заносить результат
DECLARE @NomIzd int
--объявляем курсор
DECLARE Izd_cursor SCROLL CURSOR FOR
select sp.[Номер изделия]
from ((sp inner join j on j.[Номер изделия]=sp.[Номер изделия] ) inner join p on p.[Номер детали]=sp.[Номер детали] ) inner join s on s.[Номер поставщика]=sp.[Номер поставщика]
where s.[ Номер поставщика]=указать_номер_поставщика
order by sp.[Номер изделия]
group by sp.[Номер изделия]
--если известен номер поставщика, то можно упростить запрос
--DECLARE Izd_cursor SCROLL CURSOR FOR
--select sp.[Номер изделия]
--from sp
--where sp.[ Номер поставщика]=указать_номер_поставщика
--order by sp.[Номер изделия]
--group by sp.[Номер изделия]
--если известна фамилия поставщика и по ней делается отбор, то нужно добавить еще одну таблицу в запрос
--DECLARE Izd_cursor SCROLL CURSOR FOR
--select sp.[Номер изделия]
--from sp inner join s on s.[Номер поставщика]=sp.[Номер поставщика]
--where s.[Фамилия]=’указать_фамилию_поставщика’ или =’S1’, если это наименование поставщика, или =@S1, если имя поставщика занесено в переменную S1
--order by sp.[Номер изделия]
--group by sp.[Номер изделия]
--открываем курсор
OPEN Izd_cursor
--перемещаемся на последнюю запись и заносим значение номера изделия из курсора в переменную
FETCH LAST FROM Izd_cursor INTO @NomIzd
--до тех, пока нет ошибок ( т.е. не достигнуто начало или конец записей )
WHILE @@FETCH_STATUS = 0
BEGIN
--отображаем текущее значение переменной
PRINT Номер изделия: ' + @ NomIzd
--перемещаемся на 1 строку перед текущей и заносим в переменную, предыдущая строка становится текущей
FETCH RELATIVE -1 FROM Izd_cursor INTO @NomIzd
--идем дальше по циклу на проверку
END
--закрываем курсор
CLOSE Izd_cursor;
--очищаем память
DEALLOCATE Izd_cursor;
GO
С уважением.