CLOSE в Oracle SQL — как корректно завершать курсоры

🟢CLOSE в Oracle SQL. Введение

Курсоры в PL/SQL позволяют обрабатывать строки результата запроса по одной. Но после завершения работы с курсором его необходимо закрыть, чтобы избежать утечек памяти и системных ресурсов.
Для этого используется оператор CLOSE.

Он прост, но критически важен при работе с явными курсорами.


🔤 Написание

sql
CLOSE имя_курсора;

🧮 Пример:

sql
CLOSE c_employees;

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

  • При завершении работы с явным курсором

  • В циклах обработки данных

  • В PL/SQL процедурах

  • В управлении ресурсами при большом объёме данных

  • В блоках с OPENFETCHCLOSE


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

1️⃣ Полный цикл курсора: OPEN → FETCH → CLOSE

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

Стандартная работа с курсором и обязательное закрытие.


2️⃣ CLOSE после одного FETCH

sql
DECLARE
CURSOR c IS SELECT department_name FROM departments;
v_dep departments.department_name%TYPE;
BEGIN
OPEN c;
FETCH c INTO v_dep;
DBMS_OUTPUT.PUT_LINE('Отдел: ' || v_dep);
CLOSE c;
END;

Даже если курсор используется один раз — его всё равно нужно закрыть.


3️⃣ Работа с параметрическим курсором

sql
DECLARE
CURSOR c(p_dept_id NUMBER) IS
SELECT last_name FROM employees WHERE department_id = p_dept_id;
v_last employees.last_name%TYPE;
BEGIN
OPEN c(10);
FETCH c INTO v_last;
DBMS_OUTPUT.PUT_LINE('Сотрудник: ' || v_last);
CLOSE c;
END;

Параметры не мешают правилу: открыл — закрой.


4️⃣ Проверка — открыт ли курсор

sql
IF c_emp%ISOPEN THEN
CLOSE c_emp;
END IF;

Полезно, если не уверены открыт ли он.


5️⃣ Использование EXCEPTION на случай забывания CLOSE

sql
DECLARE
CURSOR c IS SELECT * FROM dual;
v_dummy DUAL.DUMMY%TYPE;
BEGIN
OPEN c;
FETCH c INTO v_dummy;
— CLOSE забыли!
— вызовет ошибку, если потом снова открыть этот курсор
OPEN c; — ORA-06511: cursor already open
END;

Если не закрыть курсор — ошибки неизбежны.


6️⃣ Закрытие после EXIT из цикла

sql
OPEN c;
LOOP
FETCH c INTO var;
EXIT WHEN c%NOTFOUND;
-- обработка
END LOOP;
CLOSE c;

Закрытие курсора — финальный этап любого цикла.


7️⃣ Закрытие в EXCEPTION-блоке (гарантия освобождения)

sql
BEGIN
OPEN c;
FETCH c INTO var;
-- что-то пошло не так
EXCEPTION
WHEN OTHERS THEN
IF c%ISOPEN THEN
CLOSE c;
END IF;
RAISE;
END;

Всегда оставляйте CLOSE даже в случае ошибок.


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

sql
OPEN c1;
OPEN c2;
FETCH c1 INTO var1;
FETCH c2 INTO var2;CLOSE c1;
CLOSE c2;

Каждый курсор — свой CLOSE.


9️⃣ Проверка: не закрыт ли курсор дважды

sql
CLOSE c;
CLOSE c; -- ORA-01001: invalid cursor

Повторное закрытие вызывает ошибку.


🔟 Обработка в процедуре

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

Хорошая практика в процедурах — закрыть курсор явно.


🧩 Заключение

Оператор CLOSE завершает работу курсора и освобождает ресурсы. Это особенно важно при работе с большими наборами данных, повторных вызовах и в корпоративных процедурах.

💡 Запомни:

  • Всегда закрывай курсор после использования

  • Используй c%ISOPEN для проверки

  • CLOSE — последний шаг после OPEN и FETCH

  • Никогда не закрывай один и тот же курсор дважды


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

SYSDATE в Oracle SQL — как получить текущую дату и время


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