Курсоры SQL

Приветствую всех, сегодня поговорим о курсорах применяемых в 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
Обновлено: 16.01.2019 — 15:25

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.