Приветствую всех, сегодня поговорим о курсорах применяемых в SQL.
Курсоры-это операции выборки SQL работают с наборами строк, которые называются результирующие множества. Все возвращаемые строки являются строками, соответствующими примененному SQL-оператору, их может быть нуль или больше. Если своим словами, то позволяют вам выбрать строки не все а те которые вам необходимы. При чем с помощью SELECT это сделать не возможно, о то что сейчас говорю, вы поймете чуть позже, из примеров.
Применении: Иногда бывает необходимо просмотреть строки в прямом или обратном направлении один или несколько раз. Именно для этого используются курсоры. Курсор представляет собой запрос к базе данных, хранящийся на сервере СУБД, — это не оператор SELECT, но результирующее множество, выборка, полученная в результате действия оператора SELECT. После того как курсор сохранен, приложения могут «прокручивать» (просматривать) данные в прямом или обратном направлении, как только возникает такая потребность.
Вообще применения курсоров не рекомендовано к использованию.
Курсоры практически бесполезны, если их применять к приложениям, основанным на Web-технологиях (например, таких как ASP, ColdFusion, PHP и JSP). Курсоры предназначены для использования в течение сеанса связи между клиентским
приложением и сервером, но эта модель «клиент-сервер» не годится для мира Web-приложений, потому что сервер приложений является клиентом базы данных, а не конечным пользователем. А раз так, то большинство разработчиков приложений избегают использования курсоров и добиваются выполнения нужных функций, если это
необходимо, своими силами.
Работу с курсором можно разделить на несколько четко выраженных стадий.
- Прежде чем курсор может быть использован, его следует объявить (определить). В ходе этого процесса выборка данных не производится, просто определяется оператор SELECT, который будет использован, и некоторые опции курсора.
- После объявления курсор может быть открыт для использования. В ходе этого процесса уже производится выборка данных согласно предварительно определенному оператору SELECT.
- После того как курсор заполнен данными, могут быть извлечены (выбраны) отдельные необходимые строки.
- После того как это сделано, курсор должен быть за крыт и, возможно, должны быть освобождены ресурсы, которые он занимал (в зависимости от СУБД).
--------------------------- Определение курсора -------------------------------------
DECLARE contact_cursor CURSOR -- объявление курсора
FOR
SELECT * FROM Person.Person -- отбор строк для курсора
OPEN contact_cursor -- открытие курсора
CLOSE contact_cursor -- закрытие курсора
DEALLOCATE contact_cursor -- удаление курсора
FETCH извлекает данные из курсора
DECLARE contact_cursor CURSOR
SCROLL -- устанавливаем ограничение, SCROLL(позволяет двигаться курсору в любом направлении)
FOR
SELECT FirstName, LastName FROM Person.Person
OPEN contact_cursor
DECLARE @FirstName nvarchar(50),
@LastName nvarchar(50);
PRINT '1 NEXT'
FETCH NEXT FROM contact_cursor -- NEXT - извлечь строку
INTO @FirstName, @LastName
PRINT @FirstName + ' ' + @LastName
DECLARE @FirstName nvarchar(50),
@LastName nvarchar(50);
PRINT '2 NEXT'
FETCH NEXT FROM contact_cursor -- NEXT - извлечь строку
INTO @FirstName, @LastName
PRINT @FirstName + ' ' + @LastName
DECLARE @FirstName nvarchar(50),
@LastName nvarchar(50);
PRINT '3 PRIOR'
FETCH PRIOR FROM contact_cursor -- PRIOR - извлечь предыдущую строку
INTO @FirstName, @LastName
PRINT @FirstName + ' ' + @LastName
DECLARE @FirstName nvarchar(50),
@LastName nvarchar(50);
PRINT '4 LAST'
FETCH LAST FROM contact_cursor -- LAST - извлечь последнюю строку
INTO @FirstName, @LastName
PRINT @FirstName + ' ' + @LastName
DECLARE @FirstName nvarchar(50),
@LastName nvarchar(50);
PRINT '5 FIRST'
FETCH FIRST FROM contact_cursor -- FIRST - извлечь первую строку
INTO @FirstName, @LastName
PRINT @FirstName + ' ' + @LastName
DECLARE @FirstName nvarchar(50),
@LastName nvarchar(50);
PRINT '6 ABSOLUTE'
FETCH ABSOLUTE 5 FROM contact_cursor -- ABSOLUTE n - извлечь строку номер n
INTO @FirstName, @LastName
PRINT @FirstName + ' ' + @LastName
DECLARE @FirstName nvarchar(50),
@LastName nvarchar(50);
PRINT '7 RELATIVE'
FETCH RELATIVE 5 FROM contact_cursor -- RELATIVE n - извлечь n-ную строку после текущей
INTO @FirstName, @LastName
PRINT @FirstName + ' ' + @LastName
CLOSE contact_cursor
DEALLOCATE contact_cursor
GO
LOCAL — позволяет автоматически закрывать и удалять курсор после выполнения скрипта.
DECLARE contact_cursor CURSOR
LOCAL -- устанавливаем ограничение LOCAL
FOR
SELECT FirstName, LastName FROM Person.Person
OPEN contact_cursor
DECLARE @FirstName nvarchar(50), @LastName nvarchar(50);
FETCH NEXT FROM contact_cursor -- NEXT - извлечь строку
INTO @FirstName, @LastName
PRINT @FirstName + ' ' + @LastName
GO
DEALLOCATE contact_cursor -- Ошибка, так как LOCAL удалил курсор.
GO