DECLARE tovar_cursor CURSOR FOR
SELECT Товар.Назва, Операція.Дата, Товар.Цена*Операція.Кількість AS Вартість
FROM Товар INNER JOIN Операція ON Товар.КодТовара=Операція.КодТовара
WHERE Операція.КодКлиента=@id_kl
OPEN tovar_cursor
FETCH NEXT FROM tovar_cursor
INTO @nam @d @p
IF @@FETCH_STATUS<>0
PRINT «Немає покупок”
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT @message=« ”+@nam+ «”+ CAST(@d AS CHAR(12))+ « ” +CAST(@p AS CHAR(6))
PRINT @message
SET @s=@s+@p
FETCH NEXT FROM tovar_cursor
INTO @nam @d @p
END
CLOSE tovar_cursor
DEALLOCATE tovar_cursor
SELECT @message=«Загальна вартість”+ CAST(@s AS CHAR(6))
PRINT @message
//-- перехід до наступного клієнта--
FETCH NEXT FROM klient_cursor
INTO @id_kl @firm @fam
END
CLOSE klient_cursor
DEALLOCATE klient_cursor
Приклад 13.6. Курсор для виведення списку придбаних клієнтами з Москви товарів і їх загальної вартості.
Приклад 13.7. Розробити прокручуваний курсор для клієнтів з Москви. Якщо номер телефону починається на 1, видалити клієнта з таким номером і в першому записі курсору замінити першу цифру в номері телефону на 4.
DECLARE @firm VARCHAR(50)
@fam VARCHAR(50)
@tel VARCHAR(8)
@message VARCHAR(80)
PRINT «Список клієнтів”
DECLARE klient_cursor CURSOR GLOBAL SCROLL
KEYSET FOR
SELECT Фірма, Прізвище, Телефон
FROM Клієнт
WHERE Місто = «Москва”
ORDER Фірма, Прізвище
FOR UPDATE
OPEN klient_cursor
FETCH NEXT FROM klient_cursor
INTO @firm @fam @tel
WHILE @@FETCH_STATUS=0
BEGIN
SELECT @message=«Клиент” +@fam+«Фірма”+@firm «Телефон”+ @tel
PRINT @message
//-- якщо номер телефону починається на 1
//-- видалити клієнта з таким номером
IF @tel LIKE «1%”
DELETE Клієнт
WHERE CURRENT klient_cursor
ELSE
//-- перехід до наступного клієнта
FETCH NEXT FROM klient_cursor
INTO @firm @fam @tel
END
FETCH ABSOLUTE 1 FROM klient_cursor
INTO @firm @fam @tel
//-- в першому записі замінити першу цифру в
//-- номері телефону на 4
UPDATE Клієнт SET Телефон=«4” +
RIGHT(@tel,LEN(@tel)-1))
WHERE CURRENT klient_cursor
SELECT @message=«Клиент”+@fam+ «Фірма”+@firm «Телефон”+ @tel
PRINT @message
CLOSE klient_cursor
DEALLOCATE klient_cursor
Приклад 13.7. Прокручуваний курсор для клієнтів з Москви.
Приклад 13.8. Використовування курсору як вихідного параметра процедури. Процедура повертає набір даних – список товарів.
CREATE PROC my_proc
@cur CURSOR VARYING OUTPUT
AS
SET @cur=CURSOR FORWARD_ONLY STATIC FOR
SELECT Назва FROM Товар
OPEN @cur
Приклад 13.8. Використовування курсору як вихідного параметра процедури.
Виклик процедури і вивыд на друк даних з вихідного курсору здійснюється таким чином:
DECLARE @my_cur CURSOR
DECLARE @n VARCHAR(20)
EXEC my_proc @cur=@my_cur OUTPUT
FETCH NEXT FROM @my_cur INTO @n
SELECT @n
WHILE (@@FETCH_STATUS=0)
BEGIN
FETCH NEXT FROM @my_cur INTO @n
SELECT @n
END
CLOSE @my_cur
DEALLOCATE @my_cur
Контрольні питання
Дайте визначення курсору. В чому полягає його основне призначення?
Яким чином робота з пам’яттю пов’язана з курсорами?
Які дії можна виконати над курсорами?
Які типи курсорів ви можете назвати?
В чому особливість роботи і призначення послідовних курсорів? Де вони застосовні?
В чому особливість роботи і призначення прокручуваних курсорів? Де вони застосовні?
Поясніть принцип роботи і призначення статичних курсорів.
Поясніть принцип роботи і призначення динамічних курсорів.
Поясніть принцип роботи і призначення послідовних курсорів.
Поясніть принцип роботи і призначення курсорів, керованих набором ключів.
Яким чином реалізується управління курсором в середовищі MS SQL Server?
Які параметри та команди за яку дію відповідають?
Як оголошується курсор? Поясніть синтаксис команди.
Як створюється курсор? Поясніть синтаксис команди.
Як відкривається курсор? Поясніть синтаксис команди.
Як здійснюється вибірка даних з курсору? Поясніть синтаксис команди.
Як здійснюється зміна даних в курсорі? Поясніть синтаксис команди.
Як здійснюється видалення даних з курсору? Поясніть синтаксис команди.
Як здійснюється закриття курсору? Поясніть синтаксис команди.
Як здійснюється звільнення курсору? Поясніть синтаксис команди.