Курсор це тимчасова пам'ять або тимчасова робоча станція. Виділяється База даних Сервер під час виконання користувачем операцій над таблицею DML (мова обробки даних). Курсори використовуються для зберігання таблиць бази даних.
Існує 2 типи курсорів: неявні курсори та явні курсори. Вони пояснюються нижче.
- Неявні курсори: Неявні курсори також відомі як курсори за замовчуванням SQL SERVER. Ці Курсори виділяються SQL SERVER, коли користувач виконує операції DML.
- Явні курсори: Явні курсори створюються користувачами щоразу, коли вони потрібні. Явні курсори використовуються для отримання даних із таблиці в порядку «рядок за рядком».
Як створити явний курсор?
- Оголосити об’єкт Cursor
Синтаксис:
DECLARE cursor_name CURSOR FOR SELECT * FROM table_name
Запит:
DECLARE s1 CURSOR FOR SELECT * FROM studDetails>
2. Відкрийте підключення курсору
дата перетворити на рядок
Синтаксис:
OPEN cursor_connection
Запит:
OPEN s1>
Отримати дані з курсору Всього існує 6 методів доступу до даних з курсору. Вони такі:
- ПЕРШИЙ використовується для отримання лише першого рядка з таблиці курсору.
- ОСТАННІЙ використовується для отримання лише останнього рядка з таблиці курсору.
- ДАЛІ використовується для отримання даних у прямому напрямку з таблиці курсору.
- ПОПЕРЕДНІЙ використовується для отримання даних у зворотному напрямку з таблиці курсору.
- АБСОЛЮТНА н використовується для отримання точного nтисрядок із таблиці курсору.
- РІДНІ н використовується для отримання даних як поступовим, так і поступовим способом.
Синтаксис:
ОТРИМАТИ НАСТУПНИЙ/ПЕРШИЙ/ОСТАННИЙ/ПОПЕРЕДНИЙ/АБСОЛЮТНИЙ n/ВІДНОСНИЙ n З cursor_name
Запит:
FETCH FIRST FROM s1 FETCH LAST FROM s1 FETCH NEXT FROM s1 FETCH PRIOR FROM s1 FETCH ABSOLUTE 7 FROM s1 FETCH RELATIVE -2 FROM s1>
- Закрити підключення курсору
Синтаксис:
ЗАКРИТИ назву_курсора
Запит:
CLOSE s1>
- Вивільнити пам'ять курсору
Синтаксис:
DEALLOCATE cursor_name
Запит:
DEALLOCATE s1>
Як створити неявний курсор?
Неявний курсор — це курсор, який автоматично створюється PL/SQL, коли ви виконуєте оператор SQL. Вам не потрібно явно оголошувати або відкривати неявний курсор. Натомість PL/SQL керує курсором за лаштунки.
Щоб створити неявний курсор у PL/SQL, вам просто потрібно виконати оператор SQL. Наприклад, щоб отримати всі рядки з таблиці EMP, ви можете використати такий код:
Запит:
BEGIN FOR emp_rec IN SELECT * FROM emp LOOP DBMS_OUTPUT.PUT_LINE('Employee name: ' || emp_rec.ename); END LOOP; END;> У PL/SQL, коли ми виконуємо ВСТАВИТИ , ОНОВЛЕННЯ або ВИДАЛИТИ операцій автоматично створюється неявний курсор. Цей курсор містить дані, які потрібно вставити, або визначає рядки, які потрібно оновити чи видалити. Ви можете посилатися на цей курсор як на SQL-курсор у своєму коді. Курсор SQL має кілька корисних атрибутів.
- %FOUND має значення true, якщо остання операція SQL торкнулася принаймні одного рядка.
- %NOTFOUND має значення true, якщо воно не вплинуло на жодні рядки.
- %ROWCOUNT повертає кількість постраждалих рядків.
- %ISOPEN перевіряє, чи відкритий курсор.
На додаток до цих атрибутів, %BULK_ROWCOUNT і %BULK_EXCEPTIONS є специфічними для оператора FORALL, який використовується для виконання кількох операцій DML одночасно. %BULK_ROWCOUNT повертає кількість рядків, на які впливає кожна операція DML, тоді як %BULK_EXCEPTION повертає будь-які винятки, які виникли під час операцій.
Запит:
CREATE TABLE Emp( EmpID INT PRIMARY KEY, Name VARCHAR(50), Country VARCHAR(50), Age int(2), Salary int(10) ); -- Insert some sample data into the Customers table INSERT INTO Emp (EmpID, Name,Country, Age, Salary) VALUES (1, 'Shubham', 'India','23','30000'), (2, 'Aman ', 'Australia','21','45000'), (3, 'Naveen', 'Sri lanka','24','40000'), (4, 'Aditya', 'Austria','21','35000'), (5, 'Nishant', 'Spain','22','25000'); Select * from Emp;>
Вихід:
Ця програма оновлює таблицю, збільшуючи зарплату кожного працівника на 1500. Після оновлення атрибут SQL%ROWCOUNT використовується, щоб дізнатися, на скільки рядків вплинула операція.
Запит:
DECLARE total_rows number; BEGIN UPDATE Emp SET Salary = Salary + 1500; total_rows := SQL%ROWCOUNT; dbms_output.put_line(total_rows || ' rows updated.'); END;>
Вихід:
5 Emp selected PL/SQL procedure successfully completed.>
Винятки курсору SQL
Кожного разу, коли ми виконуємо SQL-запит, існує ймовірність неочікуваної помилки. Курсор проходить через кожен набір рядків для повернення в запиті SQL.
Є кілька дуже популярних винятків:
- Повторюване значення: Цей тип помилки виникає, коли курсор намагається вставити запис або кортеж, який уже існує в базі даних. цих типів помилок можна уникнути, обробивши правильну помилку conf
- Недійсний стан курсору: Щоразу, коли курсор перебуває в неприпустимому стані, цей тип помилки відображатиметься як помилка.
- Час очікування блокування: Це відбувається, коли курсор намагається заблокувати рядок або таблицю, але блокування вже утримується іншою транзакцією.
Необхідність курсору на сервері SQL
- Курсори дозволяють нам обробляти дані рядок за рядком, що може бути корисним, коли нам потрібно виконати складні обчислення або перетворення даних.
- Курсори дозволяють нам кілька разів переглядати набір результатів, що може бути корисним, коли нам потрібно виконати кілька операцій над тими самими даними.
- Курсори можуть бути корисними, коли нам потрібно об’єднати кілька таблиць зі складними зв’язками, наприклад, під час обробки ієрархічних структур даних або під час виконання рекурсивних запитів.
- Курсори дозволяють нам виконувати такі операції, як оновлення, видалення або вставлення записів на основі певних умов або критеріїв.
- Курсори особливо корисні під час обробки даних із кількох таблиць, де зв’язки не є однозначними.
Обмеження курсору SQL Server
Оскільки курсор має деякі обмеження, його слід використовувати лише тоді, коли немає іншого вибору. Ці обмеження включають:
- Під час обробки даних він накладає блокування на підмножину або всю таблицю.
- Курсор оновлює таблицю записує по одному рядку, що сповільнює її роботу.
- Хоча цикли працюють повільніше, ніж курсори, вони мають більше накладних витрат.
- Іншим фактором, який впливає на швидкість курсору, є кількість рядків і стовпців, які вводяться в курсор.
FAQ:
Q.1 Як можна уникнути курсорів?
відповідь:
Основною функцією курсорів є навігація по таблиці рядок за рядком. Нижче наведено кілька простих способів уникнути курсорів:
Q.2 Як використовувати цикл While у курсорі SQL?
відповідь:
Використання циклу while, який дозволяє вставляти набір результатів у тимчасову таблицю, є найпростішим способом уникнути потреби в курсорі.
Q.3 Що таке функції, визначені користувачем, у SQL Cursor?
відповідь:
Іноді результуючий набір рядків обчислюється за допомогою курсорів. Ми можемо досягти цього, використовуючи визначену користувачем функцію, яка відповідає специфікаціям.
Q.4 Використання об’єднань із SQL Cursor?
відповідь:
У випадках, коли потрібно обробити величезні записи, об’єднання зменшує кількість рядків коду, обробляючи лише ті стовпці, які відповідають вказаній умові.