Вступ до курсорів у SQL

Курсори - це тимчасові робочі простори, створені в пам'яті для обробки деяких команд SQL на купі даних. Занадто складне визначення? Давайте розберемося. Подумайте про курсори як для кожного циклу в SQL. Ви хочете виконати завдання на наборі рядків даних, використовуєте курсор. Скажімо, у вас є стіл працівника, який містить зарплату для кожного працівника організації. Ви хочете збільшити зарплату кожного працівника на певний відсоток. Тут ви б використовували курсор. "Як" було проілюстровано пізніше у статті.

Отже, курсори створюють тимчасову робочу область з обраним набором рядків та вказівником, який вказує на поточний рядок. Цей набір рядків, на якому курсор виконає потрібну операцію, називається активним набором даних. Вказівник витягує рядки з результату, встановленого один за одним. Потім ви можете виконувати будь-яку операцію SQL по одному рядку.

Неявні курсори

Неявні курсори, як випливає з назви, генеруються аналізатором SQL для запитів DML. Запити DML - це запити щодо маніпуляції даними. Ці запити маніпулюють або змінюють дані. Вони не заважають структурі або схемі бази даних. Запити, такі як SELECT, INSERT, UPDATE та DELETE, генерують неявний курсор. Неявні курсори приховані для кінцевого споживача.

Явні курсори

Явні курсори - це створені користувачем курсори. Коли користувач інструктує SQL-аналізатор створити курсор для активного набору, створений таким чином курсор називається явним курсором. Активний набір визначається через SELECT-запит користувачем. У цій статті ми детально висвітлюємо явні курсори.

Дії курсору - життєвий цикл курсору

Життєвий цикл курсора, як правило, включає п'ять етапів:

1. Оголосити: перший крок - оголосити курсор. Цей крок дає інструкції системі генерувати курсор із заданим набором даних. Набір даних будується за допомогою оператора SQL. На цьому етапі створюється активний набір, але тимчасова робоча область курсору ще не відкрита в пам'яті.

2. Відкрити: Далі, системі доручається відкрити курсор. На цьому етапі тимчасова робоча область завантажується в пам'ять з активним набором і формується покажчик, який вказує на перший рядок в активному наборі.

3. Вибір: це повторюваний крок у всьому процесі. Поточний рядок, вказаний вказівником, витягується і потрібне завдання виконується на даних рядків. Вказівник переміщується до наступного рядка в курсорі.

4. Закрити: Після обробки даних, курсор потрібно закрити.

5. Розподілити: це останній крок для видалення курсору та звільнення пам'яті, процесора та інших системних ресурсів, виділених курсором.

Явні курсори - в дії!

Гаразд, тепер ми маємо базове розуміння того, що таке курсори та як вони працюють. Настав час забруднити руки та створити явний курсор самостійно.

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

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

Сфера застосування курсору

  • Область застосування курсора може бути як глобальною, так і локальною . Глобальний курсор доступний протягом усього з'єднання. Локальний курсор обмежений сферою дії лише збереженими процедурами, функціями або запитом, який містить курсор.
  • Це особливість MS SQL Server. MySQL підтримує лише локальні курсори.

Рух курсору

  • MS SQL Server також дає можливість встановити рух курсору. Це може бути звичайний режим Forward_Only, який переміщує вказівник від першого ряду до останнього рядка за рядком. Або її можна прокрутити до першого, останнього, попереднього чи наступного ряду.
  • Курсори в MySQL не можна прокручувати.

Тип курсору

  • Курсор може бути статичним, оскільки він може кешувати активний набір до розсилки та може пересуватись вперед та назад через цей кешований активний набір. Курсор може швидко переходити вперед лише в статичному режимі.
  • Він також може бути динамічним, щоб дозволити додавання або видалення рядків в активному наборі, поки курсор відкритий. Ці зміни не відображаються для інших користувачів курсору в режимі набору клавіш. Курсори в 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 Command
  3. Перегляди SQL
  4. Інструменти управління SQL
  5. Типи курсорів в PL / SQL
  6. Топ 6 типів приєднань до MySQL з прикладами