OPEN в Oracle SQL — как открыть курсор и подготовить его к пошаговому извлечению данных

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

Когда вы работаете с курсорами в PL/SQL, всё начинается с команды OPEN. Она отправляет запрос, связанный с курсором, на выполнение и подготавливает курсор к пошаговому чтению строк через FETCH.

Без вызова OPEN курсор считается неактивным и не может быть использован.


🔤 Написание

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

🧮 Пример:

sql
OPEN c_employees;

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

  • В блоках с ручным управлением курсором (OPEN → FETCH → CLOSE)

  • В процедурах и функциях с параметрами

  • В бизнес-логике с выборкой данных построчно

  • Для работы с большими результатами без перегрузки памяти


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

1️⃣ Открытие простого курсора

sql
DECLARE
CURSOR c IS SELECT first_name FROM employees;
v_name employees.first_name%TYPE;
BEGIN
OPEN c;
FETCH c INTO v_name;
CLOSE c;
END;

Открытие перед извлечением первой строки.


2️⃣ OPEN курсора внутри процедуры

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

Стандартный способ использования OPEN в процедурах.


3️⃣ Открытие параметрического курсора

sql
CURSOR c(p_dept_id NUMBER) IS
SELECT last_name FROM employees WHERE department_id = p_dept_id;
OPEN c(10);

Передаём параметр при открытии.


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

sql
IF NOT c%ISOPEN THEN
OPEN c;
END IF;

Полезно для защиты от повторного открытия.


5️⃣ Ошибка при повторном OPEN

sql
OPEN c;
OPEN c; -- ORA-06511: cursor already open

Нельзя открыть уже открытый курсор.


6️⃣ OPEN FOR с динамическим SQL

sql
DECLARE
TYPE emp_cursor IS REF CURSOR;
c_emp emp_cursor;
BEGIN
OPEN c_emp FOR 'SELECT * FROM employees WHERE department_id = 10';
END;

Открытие курсора с SQL-строкой (динамически).


7️⃣ OPEN в EXCEPTION-блоке

sql
BEGIN
OPEN c;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Ошибка при открытии курсора');
END;

Реакция на возможные ошибки (например, нет прав на таблицу).


8️⃣ OPEN + BULK FETCH

sql
OPEN c;
FETCH c BULK COLLECT INTO v_array LIMIT 100;

Подготовка к пакетной обработке данных.


9️⃣ Открытие в условной логике

sql
IF some_condition THEN
OPEN c;
END IF;

Курсор открывается по логике задачи.


🔟 Работа с несколькими курсорами

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

Каждый курсор открывается и закрывается отдельно.


🧩 Заключение

OPEN — это начальная точка при работе с курсорами в PL/SQL. Он выполняет запрос и инициализирует курсор, после чего вы можете начать извлекать строки с помощью FETCH. Это один из трёх обязательных шагов: OPEN, FETCH, CLOSE.

💡 Запомни:

  • OPEN активирует курсор

  • Должен вызываться перед FETCH

  • Работает с обычными и параметрическими курсорами

  • Используется с REF CURSOR в динамическом SQL

  • Один курсор нельзя открыть дважды, пока он не закрыт


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

CLOSE в Oracle SQL — как корректно завершать курсоры и управлять ресурсами в PL/SQL


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