CURSOR в PL/SQL: пошаговая обработка строк в стиле процедурного программирования

🟢 CURSOR в PL/SQL. Введение

Оператор CURSOR используется в PL/SQL для пошагового обхода строк запроса — когда вы хотите выполнить действия над каждой строкой индивидуально, а не одной массовой операцией.

💡 Это похоже на цикл for в языках программирования, где каждая строка таблицы — это итерация.


🔤 Написание

Объявление курсора:

sql
CURSOR имя_курсора IS
SELECT ... FROM ... WHERE ...;

Использование курсора:

sql
OPEN имя_курсора;
FETCH имя_курсора INTO переменные;
CLOSE имя_курсора;

Или через цикл:

sql
FOR запись IN имя_курсора LOOP
-- действия
END LOOP;

🔄 Где часто используется

  • Пошаговая обработка строк

  • Индивидуальная логика для каждой записи

  • Аудит, логирование, накопительные действия

  • Генерация отчётов построчно

  • Интеграции с внешними API (одна строка — один запрос)


🧪 10 Примеров использования CURSOR с пояснениями

1️⃣ Простой курсор с циклом

sql
DECLARE
CURSOR emp_cur IS
SELECT employee_id, first_name FROM employees;
BEGIN
FOR emp_rec IN emp_cur LOOP
DBMS_OUTPUT.PUT_LINE(emp_rec.employee_id || ‘ — ‘ || emp_rec.first_name);
END LOOP;
END;

Выводим список сотрудников по одному.


2️⃣ Курсор с параметром

sql
DECLARE
CURSOR dept_cur(p_dept_id NUMBER) IS
SELECT first_name FROM employees WHERE department_id = p_dept_id;
BEGIN
FOR rec IN dept_cur(50) LOOP
DBMS_OUTPUT.PUT_LINE(rec.first_name);
END LOOP;
END;

Вывод сотрудников конкретного отдела.


3️⃣ Объявление переменных и FETCH

sql
DECLARE
CURSOR emp_cur IS SELECT first_name FROM employees;
v_name employees.first_name%TYPE;
BEGIN
OPEN emp_cur;
LOOP
FETCH emp_cur INTO v_name;
EXIT WHEN emp_cur%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(v_name);
END LOOP;
CLOSE emp_cur;
END;

Ручное управление курсором.


4️⃣ Курсор с UPDATE

sql
DECLARE
CURSOR emp_cur IS SELECT employee_id FROM employees WHERE salary < 5000;
BEGIN
FOR rec IN emp_cur LOOP
UPDATE employees SET salary = salary + 500 WHERE employee_id = rec.employee_id;
END LOOP;
END;

Увеличиваем зарплату низкооплачиваемым сотрудникам.


5️⃣ Использование %ROWTYPE

sql
DECLARE
CURSOR emp_cur IS SELECT * FROM employees;
v_emp employees%ROWTYPE;
BEGIN
OPEN emp_cur;
FETCH emp_cur INTO v_emp;
DBMS_OUTPUT.PUT_LINE(v_emp.first_name);
CLOSE emp_cur;
END;

Работа с полной строкой таблицы.


6️⃣ Курсор в хранимой процедуре

sql
CREATE OR REPLACE PROCEDURE print_employees IS
CURSOR emp_cur IS SELECT first_name FROM employees;
BEGIN
FOR rec IN emp_cur LOOP
DBMS_OUTPUT.PUT_LINE(rec.first_name);
END LOOP;
END;

Обёртка курсора в процедуру.


7️⃣ %FOUND и %NOTFOUND

sql
DECLARE
CURSOR c IS SELECT first_name FROM employees;
v_name employees.first_name%TYPE;
BEGIN
OPEN c;
FETCH c INTO v_name;
IF c%FOUND THEN
DBMS_OUTPUT.PUT_LINE(‘Найдено: ‘ || v_name);
END IF;
CLOSE c;
END;

Проверка, была ли получена строка.


8️⃣ Курсор с несколькими столбцами

sql
DECLARE
CURSOR cur IS SELECT first_name, salary FROM employees;
BEGIN
FOR rec IN cur LOOP
DBMS_OUTPUT.PUT_LINE(rec.first_name || ‘: ‘ || rec.salary);
END LOOP;
END;

Работа с несколькими полями.


9️⃣ Цикл WHILE с курсором

sql
DECLARE
CURSOR c IS SELECT first_name FROM employees;
v_name employees.first_name%TYPE;
BEGIN
OPEN c;
FETCH c INTO v_name;
WHILE c%FOUND LOOP
DBMS_OUTPUT.PUT_LINE(v_name);
FETCH c INTO v_name;
END LOOP;
CLOSE c;
END;

Альтернатива циклу FOR.


🔟 Курсор в условии IF

sql
DECLARE
CURSOR c IS SELECT COUNT(*) FROM employees WHERE salary > 10000;
v_count NUMBER;
BEGIN
OPEN c;
FETCH c INTO v_count;
CLOSE c;IF v_count > 0 THEN
DBMS_OUTPUT.PUT_LINE(‘Есть высокие зарплаты!’);
END IF;
END;

Решение на основе курсора.


🧩 Заключение

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

💡 Важно помнить:

  • Используйте FOR rec IN cursor LOOP — самый удобный способ

  • Не забывайте закрывать курсоры (CLOSE)

  • Для массовых операций лучше использовать DML — курсоры нужны для сложной логики


🔜 Следующая статья:

LOCK TABLE в Oracle SQL: как надёжно заблокировать таблицу


Понравилась статья? Поделиться с друзьями:
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest
0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии