Введение в курсоры в SQL

Курсоры - это временные рабочие пространства, созданные в памяти для обработки некоторых команд SQL для группы данных. Слишком сложное определение? Давай разберемся. Думайте о курсорах как о каждом цикле в SQL. Вы хотите выполнить задачу на множестве строк данных, вы используете курсор. Допустим, у вас есть таблица сотрудников, которая содержит зарплату для каждого сотрудника организации. Вы хотите увеличить зарплату каждого сотрудника на определенный процент. Здесь вы бы использовали курсор. «Как» было проиллюстрировано позже в статье.

Таким образом, курсоры создают временное рабочее пространство с выбранным набором строк и указателем, который указывает на текущую строку. Этот набор строк, над которыми курсор будет выполнять нужную операцию, называется активным набором данных. Указатель извлекает строки из результирующего набора одну за другой. Затем вы можете выполнить любую операцию SQL по одной строке за раз.

Неявные курсоры

Неявные курсоры, как следует из названия, генерируются анализатором SQL для запросов DML. DML-запросы - это запросы на манипулирование данными. Эти запросы манипулируют или изменяют данные. Они не мешают структуре или схеме базы данных. Такие запросы, как SELECT, INSERT, UPDATE и DELETE, генерируют неявный курсор. Неявные курсоры скрыты для конечного пользователя.

Явные курсоры

Явные курсоры являются пользовательскими курсорами. Когда пользователь инструктирует синтаксический анализатор SQL создать курсор для активного набора, созданный таким образом курсор называется явным курсором. Активный набор определяется с помощью запроса SELECT пользователем. Мы подробно рассмотрим явные курсоры в этой статье.

Действия курсора - жизненный цикл курсора

Жизненный цикл курсора обычно состоит из пяти этапов:

1. Объявление: первый шаг - объявление курсора. Этот шаг дает системе команду сгенерировать курсор с заданным набором данных. Набор данных построен с использованием оператора SQL. На этом этапе активный набор создается, но временная рабочая область курсора еще не открыта в памяти.

2. Открыть: далее система получает указание открыть курсор. На этом этапе временное рабочее пространство загружается в память с активным набором и генерируется указатель, который указывает на первую строку в активном наборе.

3. Получение: это повторяющийся шаг во всем процессе. Текущая строка, указанная указателем, извлекается, и желаемая задача выполняется с данными строки. Указатель переместится на следующую строку курсора.

4. Закрыть: после того, как обработка данных завершена, курсор должен быть закрыт.

5. Deallocate: это последний шаг для удаления курсора и освобождения памяти, процессора и других системных ресурсов, выделенных для курсора.

Явные курсоры - в действии!

Итак, теперь у нас есть общее представление о том, что такое курсоры и как они работают. Пришло время испачкать руки и самим создать явный курсор.

Терминология курсоров в SQL

Давайте разберемся в терминологии, используемой в этом синтаксисе.

Курсор Область

  • Область действия курсора может быть ГЛОБАЛЬНОЙ или ЛОКАЛЬНОЙ . Глобальный курсор доступен по всему соединению. Локальный курсор ограничен областью действия только хранимыми процедурами, функциями или запросом, который содержит курсор.
  • Это особенность MS SQL Server. MySQL поддерживает только локальные курсоры.

Движение курсора

  • MS SQL Server также дает возможность установить движение курсора. Это может быть либо обычный режим Forward_Only, который перемещает указатель от первой строки до последней строки за строкой. Или его можно прокрутить до первой, последней, предыдущей или следующей строки.
  • Курсоры в MySQL не прокручиваются.

Тип курсора

  • Курсор может быть статическим, так как он может кэшировать активный набор до освобождения и может перемещаться вперед и назад по этому кэшированному активному набору. Курсор может быть fast_forward только в статическом режиме.
  • Он также может быть динамическим, чтобы разрешить добавление или удаление строк в активном наборе, когда курсор открыт. Эти изменения не видны другим пользователям курсора в режиме набора клавиш. Курсоры в MySQL только fast_forward.

Блокировка курсора

  • Блокировки курсора полезны в многопользовательской среде. Они блокируют строку, так что два пользователя не могут одновременно работать с одними и теми же данными Это обеспечивает целостность данных.
  • Блокировка только для чтения означает, что строка не может быть обновлена.
  • Блокировки прокрутки блокируют строки по мере их извлечения в курсоре, гарантируя, что задача выполнена успешно и обновленные данные доступны за пределами курсора. Оптимистичные попытки обновить строку без какой-либо блокировки. Таким образом, если строка была обновлена ​​вне курсора, задача не будет выполнена успешно.
  • MySQL поддерживает только блокировки только для чтения. Это означает, что MySQL не будет обновлять фактическую таблицу, а скопирует данные для выполнения команд обновления.

Таким образом, мы видим, что эти опции доступны только в MS SQL Server. Это делает синтаксис для курсоров MySQL еще более простым.

пример

Давайте теперь обновим зарплату сотрудников в нашей таблице сотрудников.

Мы будем использовать приведенные ниже данные в этих курсорах в примере SQL.

Наш код курсора будет следующим:

DECLARE @sal float
DECLARE @newsal float
DECLARE Emp_Cur CURSOR FOR SELECT Salary, Updated_Salary FROM Employees
OPEN Emp_Cur
FETCH NEXT FROM Emp_Cur INTO @sal, @newsal
WHILE @@FETCH_STATUS = 0
BEGIN
SET @newsal = @sal*1.25
UPDATE Employees SET Updated_Salary = @newsal WHERE CURRENT OF Emp_Cur
FETCH NEXT FROM Emp_Cur INTO @sal, @newsal
END
CLOSE Emp_Cur
DEALLOCATE Emp_Cur

И вывод после выполнения вышеупомянутой команды курсора будет:

Вывод - курсоры в SQL

Таким образом, мы увидели, что такое курсоры, как их использовать и где их избежать. Курсоры оказываются полезной утилитой для разработчиков, но за счет производительности. Так что будьте осторожны, когда вы выбираете курсоры.

Рекомендуемые статьи

Это руководство по курсорам в SQL. Здесь мы обсуждаем типы, жизненный цикл и терминологию курсора в SQL с примерами. Вы также можете просмотреть наши другие предлагаемые статьи -

  1. Типы объединений в SQL
  2. Команда SQL Alter
  3. Представления SQL
  4. Инструменты управления SQL
  5. Типы курсоров в PL / SQL
  6. 6 лучших типов соединений в MySQL с примерами