
PL SQL – это процедурное расширение SQL, разработанное для Oracle Database. Оно позволяет создавать блоки кода, которые объединяют управляющие конструкции, циклы и обработку ошибок вместе с запросами к базе данных. Основное преимущество PL SQL – возможность выполнения сложных операций внутри самой базы, снижая нагрузку на клиентские приложения.
Для старта работы необходимо установить Oracle Database Express Edition и SQL Developer. Эти инструменты позволяют создавать и тестировать блоки PL SQL, управлять схемами и просматривать результаты выполнения запросов. Рекомендуется начать с написания простых анонимных блоков, содержащих DECLARE, BEGIN и END, чтобы понять базовую структуру языка.
Следующий шаг – освоение управляющих конструкций: IF, CASE, LOOP, WHILE. Для каждого блока полезно создавать примеры с таблицами сотрудников, заказов или клиентов, чтобы наблюдать изменения данных в реальном времени. Практика на конкретных таблицах позволяет быстрее закрепить синтаксис и логику обработки.
Работа с курсорами и обработка исключений – ключевые этапы обучения. Необходимо научиться использовать EXCEPTION для перехвата ошибок и CURSOR для выборки нескольких строк с последующей обработкой в цикле. Практические упражнения с реальными сценариями, например обновление цен или подсчет статистики продаж, обеспечивают понимание применения этих инструментов в бизнес-задачах.
На этом этапе важно закрепить знания, создавая небольшие процедуры и функции, которые можно вызывать повторно. Рекомендуется документировать каждый блок, включая входные и выходные параметры, чтобы упростить отладку и поддержку кода в будущем.
Установка и настройка среды для работы с PL SQL

Для работы с PL SQL требуется установить Oracle Database и клиентские инструменты для разработки, такие как SQL*Plus или Oracle SQL Developer.
-
Установка Oracle Database:
- Скачайте версию Oracle Database с официального сайта Oracle. Для обучения подойдет Oracle Database Express Edition (XE) – бесплатная и легковесная версия.
- Запустите установщик и следуйте инструкциям. Выберите тип установки «Desktop class» для упрощенной конфигурации.
- Установите пароль администратора (SYSTEM) и запомните его для доступа к базе данных.
- Проверьте работу сервера: откройте командную строку и выполните
sqlplus system@XEдля подключения к базе.
-
Установка Oracle SQL Developer:
- Скачайте последнюю версию SQL Developer с официального сайта Oracle.
- Распакуйте архив в удобное место. Дополнительно установка Java не требуется, так как пакет поставляется с JDK.
- Запустите SQL Developer и создайте новое подключение к базе данных, используя логин SYSTEM и пароль, указанный при установке Oracle Database.
-
Настройка среды:
- Создайте отдельного пользователя базы данных для работы с PL SQL, чтобы не использовать SYSTEM для учебных задач:
CREATE USER plsql_user IDENTIFIED BY password;
GRANT CONNECT, RESOURCE TO plsql_user; - Проверьте соединение в SQL Developer, убедитесь, что статус подключения «Connected».
- Для работы с командной строкой используйте SQL*Plus: откройте терминал и подключитесь командой:
sqlplus plsql_user/password@XE - При необходимости настройте переменные окружения ORACLE_HOME и PATH для удобного запуска инструментов из терминала.
- Создайте отдельного пользователя базы данных для работы с PL SQL, чтобы не использовать SYSTEM для учебных задач:
После выполнения этих шагов среда готова к созданию таблиц, процедур и триггеров на PL SQL. Все инструменты позволяют одновременно писать код и тестировать его выполнение на реальной базе данных.
Создание и выполнение первых PL SQL блоков

PL SQL блок состоит из трёх частей: объявления, исполняемой секции и обработки исключений. Базовый синтаксис начинается с ключевого слова DECLARE (при необходимости объявления переменных), затем BEGIN – исполняемая часть, и EXCEPTION – обработка ошибок, завершение блока осуществляется END;.
Пример простого блока без объявления переменных:
BEGIN
DBMS_OUTPUT.PUT_LINE('Привет, PL SQL');
END;
Блок с объявлением переменной:
DECLARE
v_message VARCHAR2(50);
BEGIN
v_message := 'PL SQL работает';
DBMS_OUTPUT.PUT_LINE(v_message);
END;
Рекомендуется всегда завершать строки внутри блока точкой с запятой. Для обработки ошибок используйте секцию EXCEPTION, например:
BEGIN
v_result := 10 / 0;
EXCEPTION
WHEN ZERO_DIVIDE THEN
DBMS_OUTPUT.PUT_LINE('Ошибка: деление на ноль');
END;
Использование переменных и типов данных в скриптах

Пример объявления переменных:
DECLARE
v_id NUMBER(5);
v_name VARCHAR2(50);
v_created DATE;
v_active BOOLEAN;
END;
Типы данных можно уточнять: NUMBER(p,s) определяет точность и масштаб числа, VARCHAR2(n) задаёт максимальную длину строки. Для логических условий BOOLEAN принимает значения TRUE, FALSE или NULL.
Присваивание значений осуществляется через оператор := внутри блока BEGIN … END:
BEGIN
v_id := 101;
v_name := 'Иван';
v_created := SYSDATE;
v_active := TRUE;
END;
Для работы с переменными в SQL-запросах используют конструкцию SELECT … INTO. Пример:
BEGIN
SELECT first_name INTO v_name
FROM employees
WHERE employee_id = 101;
END;
Рекомендуется давать переменным осмысленные имена, соответствующие содержимому, избегать сокращений без контекста. Типы данных выбираются с учётом максимально возможных значений, чтобы исключить ошибки переполнения или усечения данных.
Для динамических операций, например сложных вычислений или обработки нескольких строк, эффективнее использовать PL/SQL коллекции и PL/SQL записи (RECORD), что повышает читаемость и поддерживаемость скриптов.
Организация условной логики и циклов в коде

В PL/SQL условная логика реализуется с помощью конструкций IF...ELSIF...ELSE и CASE. Эти конструкции позволяют направлять поток выполнения в зависимости от значений переменных или результатов запросов.
IF...ELSIF...ELSEиспользуется для проверки нескольких условий последовательно. Пример:
DECLARE
v_score NUMBER := 85;
BEGIN
IF v_score >= 90 THEN
DBMS_OUTPUT.PUT_LINE('Отлично');
ELSIF v_score >= 75 THEN
DBMS_OUTPUT.PUT_LINE('Хорошо');
ELSE
DBMS_OUTPUT.PUT_LINE('Нужно улучшать');
END IF;
END;
CASEподходит для проверки значения переменной против конкретных вариантов:
DECLARE
v_day NUMBER := 3;
BEGIN
CASE v_day
WHEN 1 THEN DBMS_OUTPUT.PUT_LINE('Понедельник');
WHEN 2 THEN DBMS_OUTPUT.PUT_LINE('Вторник');
WHEN 3 THEN DBMS_OUTPUT.PUT_LINE('Среда');
ELSE DBMS_OUTPUT.PUT_LINE('Другое');
END CASE;
END;
Циклы в PL/SQL позволяют повторять блоки кода. Основные типы циклов:
- LOOP – бесконечный цикл с обязательным использованием
EXITдля выхода:
DECLARE
i NUMBER := 1;
BEGIN
LOOP
DBMS_OUTPUT.PUT_LINE('Итерация: ' || i);
i := i + 1;
EXIT WHEN i > 5;
END LOOP;
END;
- WHILE – проверка условия перед каждой итерацией:
DECLARE
i NUMBER := 1;
BEGIN
WHILE i <= 5 LOOP
DBMS_OUTPUT.PUT_LINE('Итерация: ' || i);
i := i + 1;
END LOOP;
END;
- FOR – цикл с заранее известным числом итераций:
BEGIN
FOR i IN 1..5 LOOP
DBMS_OUTPUT.PUT_LINE('Итерация: ' || i);
END LOOP;
END;
Рекомендации по организации кода:
- Использовать
CASE, если проверка значения переменной более наглядна, чем последовательныеIF. - Для циклов с неизвестным числом итераций применять
LOOPилиWHILE. - Вложенные циклы ограничивать до двух уровней для читаемости.
- Выход из цикла оформлять через
EXIT WHEN, избегая сложных условий в середине блока.
Создание и вызов процедур и функций
Процедуры и функции позволяют структурировать код и повторно использовать логические блоки. Процедура выполняет действия без возвращаемого значения, функция возвращает результат.
Синтаксис процедуры:
«`sql
CREATE OR REPLACE PROCEDURE имя_процедуры (параметры)
IS
BEGIN
— тело процедуры
END имя_процедуры;
Синтаксис функции:
«`sql
CREATE OR REPLACE FUNCTION имя_функции (параметры)
RETURN тип_данных
IS
BEGIN
— тело функции
RETURN значение;
END имя_функции;
Пример процедуры для добавления сотрудника:
«`sql
CREATE OR REPLACE PROCEDURE add_employee (
p_first_name IN employees.first_name%TYPE,
p_last_name IN employees.last_name%TYPE,
p_salary IN employees.salary%TYPE
)
IS
BEGIN
INSERT INTO employees(first_name, last_name, salary)
VALUES (p_first_name, p_last_name, p_salary);
END add_employee;
Пример функции для вычисления средней зарплаты отдела:
«`sql
CREATE OR REPLACE FUNCTION avg_salary(p_department_id IN employees.department_id%TYPE)
RETURN NUMBER
IS
v_avg_salary NUMBER;
BEGIN
SELECT AVG(salary) INTO v_avg_salary
FROM employees
WHERE department_id = p_department_id;
RETURN v_avg_salary;
END avg_salary;
Вызов процедур и функций:
| Тип | Пример вызова | Описание |
|---|---|---|
| Процедура | EXEC add_employee(‘Иван’, ‘Иванов’, 50000); | Добавляет новую запись в таблицу employees |
| Функция | SELECT avg_salary(10) FROM dual; | Возвращает среднюю зарплату сотрудников отдела с id = 10 |
Рекомендации:
- Использовать понятные имена, отражающие действия процедуры или функции.
- Указывать типы данных для всех параметров и возвращаемого значения.
- Функции не должны изменять внешние данные, использовать только локальные вычисления.
- Обрабатывать ошибки через блок EXCEPTION.
Работа с курсорами для обработки наборов данных
Курсоры в PL/SQL позволяют обрабатывать несколько строк из запроса последовательно. Основные типы курсоров – явные и неявные. Неявные курсоры создаются автоматически для операторов DML (INSERT, UPDATE, DELETE, SELECT INTO) и доступны через атрибуты %FOUND, %NOTFOUND, %ROWCOUNT, %ISOPEN.
Для обработки сложных выборок используют явные курсоры. Их создание начинается с объявления:
CURSOR cursor_name IS SELECT column1, column2 FROM table_name WHERE condition;
После объявления курсор нужно открыть с помощью OPEN cursor_name;, затем построчно извлекать данные через FETCH cursor_name INTO variable1, variable2;. Обязательно закрывать курсор после обработки данных: CLOSE cursor_name;.
Пример обработки набора данных с использованием явного курсора:
DECLARE
CURSOR emp_cursor IS SELECT employee_id, salary FROM employees WHERE department_id = 10;
v_emp_id employees.employee_id%TYPE;
v_salary employees.salary%TYPE;
BEGIN
OPEN emp_cursor;
LOOP
FETCH emp_cursor INTO v_emp_id, v_salary;
EXIT WHEN emp_cursor%NOTFOUND;
v_salary := v_salary * 1.1; -- увеличение зарплаты на 10%
UPDATE employees SET salary = v_salary WHERE employee_id = v_emp_id;
END LOOP;
CLOSE emp_cursor;
END;
Рекомендации при работе с курсорами:
- Использовать курсоры только при необходимости обработки нескольких строк; для единичных выборок предпочтительнее SELECT INTO.
- Закрывать все открытые курсоры, чтобы избежать утечек памяти.
- При больших объемах данных применять BULK COLLECT и FORALL для ускорения обработки.
- Стараться минимизировать использование курсоров в триггерах, чтобы не снижать производительность.
Обработка ошибок и управление исключениями в PL SQL

В PL SQL ошибки классифицируются на системные и пользовательские. Системные ошибки автоматически вызывают исключения, например, NO_DATA_FOUND, TOO_MANY_ROWS, ZERO_DIVIDE. Пользовательские исключения создаются через оператор EXCEPTION и активируются с помощью RAISE.
Блок обработки исключений в PL SQL начинается после ключевого слова EXCEPTION. Структура выглядит так: сначала указываются конкретные исключения, затем общий блок WHEN OTHERS THEN для перехвата всех оставшихся ошибок.
Пример обработки системного исключения NO_DATA_FOUND:
BEGIN
SELECT salary INTO v_salary FROM employees WHERE employee_id = 100;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('Сотрудник не найден');
END;
Для пользовательских исключений создаются переменные через EXCEPTION и вызываются при выполнении условий:
DECLARE
e_salary_too_low EXCEPTION;
v_salary NUMBER := 2000;
BEGIN
IF v_salary < 3000 THEN
RAISE e_salary_too_low;
END IF;
EXCEPTION
WHEN e_salary_too_low THEN
DBMS_OUTPUT.PUT_LINE('Зарплата ниже допустимого уровня');
END;
Использование SQLCODE и SQLERRM позволяет получать код и текст ошибки в блоке WHEN OTHERS. Это полезно для логирования и передачи информации в другие приложения:
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Ошибка: ' || SQLCODE || ' - ' || SQLERRM);
END;
Рекомендуется перехватывать только известные исключения и использовать WHEN OTHERS исключительно для логирования или повторного возбуждения ошибки через RAISE. Это предотвращает скрытие критических проблем и облегчает отладку.
При работе с транзакциями ошибки часто сопровождаются откатом изменений. Для отката используют ROLLBACK, а успешные операции фиксируют через COMMIT. Например:
BEGIN
UPDATE employees SET salary = salary * 1.1 WHERE department_id = 10;
COMMIT;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
DBMS_OUTPUT.PUT_LINE('Ошибка обновления: ' || SQLERRM);
END;
Для комплексных программных модулей PL SQL лучше применять отдельные процедуры для обработки ошибок, что повышает читаемость кода и облегчает поддержку.
Вопрос-ответ:
Что такое PL/SQL и чем он отличается от обычного SQL?
PL/SQL — это процедурное расширение SQL, разработанное для работы с базами данных Oracle. В отличие от стандартного SQL, который используется только для запросов и манипуляций с данными, PL/SQL позволяет писать программы с переменными, условиями, циклами и обработкой ошибок. Это дает возможность создавать сложные логические конструкции внутри базы данных и выполнять набор команд как единое целое.
Как создать и выполнить простую процедуру в PL/SQL?
Процедура в PL/SQL создается с помощью команды CREATE PROCEDURE. Сначала задается имя процедуры, затем указываются входные и выходные параметры, если они нужны, и после этого пишется тело с набором инструкций. Например, можно написать процедуру, которая выводит список всех сотрудников определенного отдела. После создания процедура компилируется в базе данных и может быть вызвана через команду EXECUTE или из другого блока PL/SQL.
Что такое курсоры в PL/SQL и когда их стоит использовать?
Курсоры в PL/SQL используются для работы с результатами запросов, которые возвращают несколько строк. Они позволяют перебирать строки по одной и обрабатывать их внутри блока кода. Курсоры бывают явные и неявные: неявные создаются автоматически при выполнении DML-операций, а явные создаются вручную с определением SQL-запроса. Их стоит использовать, когда нужно последовательно обрабатывать множество строк, например, для подсчета или обновления данных в таблицах.
Как работает обработка ошибок в PL/SQL?
В PL/SQL есть механизм обработки ошибок с использованием секции EXCEPTION. В этой части блока кода можно определить, какие действия выполнить при возникновении конкретной ошибки или любого исключения. Например, если попытка вставки дублирующей строки вызывает ошибку уникального ключа, можно перехватить исключение DUP_VAL_ON_INDEX и вывести сообщение для пользователя или записать информацию в лог. Такой подход помогает избегать аварийного завершения программы и контролировать поведение приложения.
Чем отличаются функции от процедур в PL/SQL?
Функции и процедуры похожи, но имеют ключевое различие: функции возвращают значение, которое можно использовать в SQL-запросах или присваивать переменной, а процедуры выполняют набор действий и не возвращают результат напрямую. Например, функция может вычислять сумму чисел и возвращать ее, а процедура может обновлять записи в таблице без возвращаемого значения. Это различие помогает выбирать подходящий тип блока кода для конкретной задачи.
С чего лучше начать изучение PL/SQL, если у меня нет опыта программирования?
Для новичка оптимально начать с понимания базовой структуры PL/SQL: блоков, операторов DECLARE, BEGIN, EXCEPTION и END. Сначала стоит научиться писать простые анонимные блоки, которые выполняют арифметические операции или выводят сообщения. После этого можно переходить к созданию процедур и функций, работать с курсорами и обрабатывать исключения. Практика на простых примерах помогает закрепить синтаксис и понять логику работы с базой данных, прежде чем переходить к более сложным сценариям.
