PL/SQL - Курсоры: Ваш портал для работы с данными

Здравствуйте, будущие маги баз данных! Сегодня мы отправимся в увлекательное путешествие в мир курсоров PL/SQL. Не беспокойтесь, если вы новички в программировании – я буду вашим доброжелательным проводником, и мы рассмотрим эту тему шаг за шагом. К концу этого урока вы будете управлять курсорами как профессионал!

PL/SQL - Cursors

Что такое курсоры?

Прежде чем мы углубимся, давайте поймем, что такое курсоры. Представьте, что вы наbuffet (я знаю, уже вызывает аппетит!). У вас есть тарелка (ваша программа), и вы смотрите на все вкусные блюда (ваши таблицы базы данных). Курсор похож на вашу руку – он помогает вам выбирать конкретные предметы сbuffet и класть их на вашу тарелку. В терминах базы данных, курсор позволяет вам извлекать и манипулировать данными из вашей базы данных,一行 за一行ом.

Теперь давайте рассмотрим два типа курсоров в PL/SQL:

Неявные курсоры

Неявные курсоры похожи на автоматические функции в вашей камере смартфона – они работают в фоновом режиме, и вам не нужно делать много. Oracle создает и управляет этими курсорами за вас при выполнении SQL-запросов.

Давайте рассмотрим пример:

BEGIN
UPDATE employees SET salary = salary * 1.1 WHERE department_id = 20;

IF SQL%FOUND THEN
DBMS_OUTPUT.PUT_LINE('Сотрудники получили прибавку в 10%!');
ELSE
DBMS_OUTPUT.PUT_LINE('Сотрудники в отделе 20 не найдены.');
END IF;
END;
/

В этом коде:

  1. Мы обновляем зарплаты сотрудников в отделе 20.
  2. SQL%FOUND – это атрибут неявного курсора, который возвращает TRUE, если UPDATE影响了 какие-либо строки.
  3. Мы используем это, чтобы вывести соответствующее сообщение.

Другие полезные атрибуты неявного курсора включают:

  • SQL%ROWCOUNT: Количествоaffected строк
  • SQL%ISOPEN: Всегда возвращает FALSE для неявных курсоров
  • SQL%NOTFOUND: Противоположность SQL%FOUND

Явные курсоры

Явные курсоры похожи на ручной режим в вашей камере – у вас больше контроля, но вам нужно управлять ими самостоятельно. Они идеальны, когда вам нужно обрабатывать строки одну за другой или когда вы хотите больше контроля над процессом извлечения данных.

Давайте разберем жизненный цикл явного курсора:

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

Сначала мы должны сказать нашему PL/SQL-блоку, с какими данными мы хотим работать. Это как решить, что вы хотите съесть наbuffet перед тем, как начать наполнять свою тарелку.

DECLARE
CURSOR c_emp IS
SELECT employee_id, first_name, last_name
FROM employees
WHERE department_id = 30;

Здесь мы объявили курсор c_emp, который будет извлекать данные сотрудников из отдела 30.

Открытие курсора

Теперь, когда мы решили, что мы хотим, это время подойти кbuffet (или в нашем случае, к базе данных).

OPEN c_emp;

Эта строка говорит Oracle execute SELECT-запрос и подготовить результирующий набор.

Извлечение курсора

Теперь мы действительно начинаем класть еду на нашу тарелку – или в терминах программирования, извлекать данные строку за строкой.

DECLARE
v_emp_id employees.employee_id%TYPE;
v_first_name employees.first_name%TYPE;
v_last_name employees.last_name%TYPE;
BEGIN
OPEN c_emp;
LOOP
FETCH c_emp INTO v_emp_id, v_first_name, v_last_name;
EXIT WHEN c_emp%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(v_emp_id || ' - ' || v_first_name || ' ' || v_last_name);
END LOOP;
CLOSE c_emp;
END;
/

В этом примере:

  1. Мы объявляем переменные для хранения извлеченных данных.
  2. Мы открываем курсор.
  3. Мы используем ЦИКЛ для извлечения строк одну за другой.
  4. Мы退出 из цикла, когда больше нет строк (c_emp%NOTFOUND).
  5. Мы выводим детали каждого сотрудника.

Закрытие курсора

Как и в случае сbuffet, когда вы заканчиваете есть, вам нужно закрыть курсор, когда вы закончили.

CLOSE c_emp;

Это высвобождает ресурсы, связанные с курсором.

Циклы FOR с курсорами: Ускоренный способ

Теперь у меня есть для вас маленький секрет. Есть способ сделать работу с курсорами еще проще – это называется Цикл FOR с курсором. Это как если бы у вас был полезный друг наbuffet, который наполнял бы вашу тарелку для вас!

BEGIN
FOR emp_rec IN (SELECT employee_id, first_name, last_name
FROM employees
WHERE department_id = 30) LOOP
DBMS_OUTPUT.PUT_LINE(emp_rec.employee_id || ' - ' ||
emp_rec.first_name || ' ' ||
emp_rec.last_name);
END LOOP;
END;
/

Этот магический цикл делает за вас всю работу:

  1. Он объявляет переменную-запись (emp_rec) для хранения каждой строки.
  2. Он открывает курсор, извлекает каждую строку и закрывает курсор автоматически.
  3. Вам нужно только сосредоточиться на том, что делать с каждой строкой внутри цикла.

Методы курсоров: Ваш удобный набор инструментов

Давайте подведем итог методы, которые мы можем использовать с курсорами в удобной таблице:

Метод Описание
DECLARE Определяет курсор и его SELECT-запрос
OPEN Выполняет SELECT-запрос и подготавливает результирующий набор
FETCH Извлекает следующую строку из результирующего набора
CLOSE Закрывает курсор и высвобождает ресурсы

Помните, с большой властью приходит большая ответственность. Всегда закрывайте свои курсоры, когда вы закончили с ними, чтобы высвободить ресурсы!

И вот оно, мои дорогие студенты! Вы только что сделали свои первые шаги в мир курсоров PL/SQL. Практикуйтесь с этими концепциями, экспериментируйте с различными сценариями, и вскоре вы будетеnavigate через свои базы данных с грацией и точностью опытного программиста.

Remember, in programming, as in life, the key is to keep learning and experimenting. So go forth, write some code, make some mistakes, and most importantly, have fun! Who knows? The next great database application might just be at your fingertips. Happy coding!

Credits: Image by storyset