Приветствую всех, сегодня поговорим о курсорах применяемых в SQL.
Курсоры-это операции выборки SQL работают с наборами строк, которые называются результирующие множества. Все возвращаемые строки являются строками, соответствующими примененному SQL-оператору, их может быть нуль или больше. Если своим словами, то позволяют вам выбрать строки не все а те которые вам необходимы. При чем с помощью SELECT это сделать не возможно, о то что сейчас говорю, вы поймете чуть позже, из примеров.
Применении: Иногда бывает необходимо просмотреть строки в прямом или обратном направлении один или несколько раз. Именно для этого используются курсоры. Курсор представляет собой запрос к базе данных, хранящийся на сервере СУБД, — это не оператор SELECT, но результирующее множество, выборка, полученная в результате действия оператора SELECT. После того как курсор сохранен, приложения могут «прокручивать» (просматривать) данные в прямом или обратном направлении, как только возникает такая потребность.
Вообще применения курсоров не рекомендовано к использованию.
Курсоры практически бесполезны, если их применять к приложениям, основанным на Web-технологиях (например, таких как ASP, ColdFusion, PHP и JSP). Курсоры предназначены для использования в течение сеанса связи между клиентским
приложением и сервером, но эта модель «клиент-сервер» не годится для мира Web-приложений, потому что сервер приложений является клиентом базы данных, а не конечным пользователем. А раз так, то большинство разработчиков приложений избегают использования курсоров и добиваются выполнения нужных функций, если это
необходимо, своими силами.
Работу с курсором можно разделить на несколько четко выраженных стадий.
- Прежде чем курсор может быть использован, его следует объявить (определить). В ходе этого процесса выборка данных не производится, просто определяется оператор SELECT, который будет использован, и некоторые опции курсора.
- После объявления курсор может быть открыт для использования. В ходе этого процесса уже производится выборка данных согласно предварительно определенному оператору SELECT.
- После того как курсор заполнен данными, могут быть извлечены (выбраны) отдельные необходимые строки.
- После того как это сделано, курсор должен быть за крыт и, возможно, должны быть освобождены ресурсы, которые он занимал (в зависимости от СУБД).
1 2 3 4 5 6 7 8 9 |
--------------------------- Определение курсора ------------------------------------- DECLARE contact_cursor CURSOR -- объявление курсора FOR SELECT * FROM Person.Person -- отбор строк для курсора OPEN contact_cursor -- открытие курсора CLOSE contact_cursor -- закрытие курсора DEALLOCATE contact_cursor -- удаление курсора |
FETCH извлекает данные из курсора
1 2 3 4 |
DECLARE contact_cursor CURSOR SCROLL -- устанавливаем ограничение, SCROLL(позволяет двигаться курсору в любом направлении) FOR SELECT FirstName, LastName FROM Person.Person |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
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 — позволяет автоматически закрывать и удалять курсор после выполнения скрипта.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
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 |