Материал: 13БД

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

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

Контрольні питання

  1. Дайте визначення курсору. В чому полягає його основне призначення?

  2. Яким чином робота з пам’яттю пов’язана з курсорами?

  3. Які дії можна виконати над курсорами?

  4. Які типи курсорів ви можете назвати?

  5. В чому особливість роботи і призначення послідовних курсорів? Де вони застосовні?

  6. В чому особливість роботи і призначення прокручуваних курсорів? Де вони застосовні?

  7. Поясніть принцип роботи і призначення статичних курсорів.

  8. Поясніть принцип роботи і призначення динамічних курсорів.

  9. Поясніть принцип роботи і призначення послідовних курсорів.

  10. Поясніть принцип роботи і призначення курсорів, керованих набором ключів.

  11. Яким чином реалізується управління курсором в середовищі MS SQL Server?

  12. Які параметри та команди за яку дію відповідають?

  13. Як оголошується курсор? Поясніть синтаксис команди.

  14. Як створюється курсор? Поясніть синтаксис команди.

  15. Як відкривається курсор? Поясніть синтаксис команди.

  16. Як здійснюється вибірка даних з курсору? Поясніть синтаксис команди.

  17. Як здійснюється зміна даних в курсорі? Поясніть синтаксис команди.

  18. Як здійснюється видалення даних з курсору? Поясніть синтаксис команди.

  19. Як здійснюється закриття курсору? Поясніть синтаксис команди.

  20. Як здійснюється звільнення курсору? Поясніть синтаксис команди.