PL/SQL
PL/SQL (Procedural Language / Structured Query Language) — это процедурное расширение языка SQL, разработанное корпорацией Oracle для использования в системах управления базами данных (СУБД) Oracle Database и некоторых других СУБД (например, TimesTen, IBM Db2 — с адаптациями). PL/SQL объединяет возможности SQL (язык запросов и манипулирования данными) с процедурными конструкциями, такими как переменные, циклы, условия, обработка ошибок и подпрограммы (процедуры, функции, пакеты). Основная цель PL/SQL — создание сложной бизнес-логики, хранимой и выполняемой непосредственно на сервере базы данных, что повышает производительность, безопасность и целостность данных.
История
PL/SQL был разработан компанией Oracle в конце 1980-х годов. Первая версия языка появилась в 1991 году в составе СУБД Oracle 6.0. Язык был создан как ответ на потребность в создании эффективных, переносимых и безопасных серверных приложений, которые могли бы обрабатывать данные без постоянного обмена между клиентом и сервером. В 1992 году с выходом Oracle 7 PL/SQL получил поддержку хранимых процедур, функций и пакетов. В 1997 году в Oracle 8 была добавлена поддержка объектно-ориентированного программирования (типы объектов, наследование). В 2001 году в Oracle 9i появились коллекции (вложенные таблицы, массивы VARRAY) и улучшенная обработка исключений. В 2007 году с Oracle 11g была введена поддержка условной компиляции и улучшена производительность. В 2013 году с Oracle 12c PL/SQL получил поддержку SQL-операций в пакетном режиме, а в 2018 году с Oracle 18c — возможность использования в автономных транзакциях. На 2025 год PL/SQL остаётся основным языком для разработки серверной логики в экосистеме Oracle, хотя его использование сокращается в пользу более современных подходов (например, Java в БД, микросервисы).
Архитектура и принцип работы
PL/SQL — это интерпретируемый язык, но его код компилируется в байт-код (P-код), который хранится в базе данных и выполняется виртуальной машиной PL/SQL Engine. Этот движок встроен в ядро СУБД Oracle, что позволяет выполнять код непосредственно на сервере, без передачи данных клиенту. Код PL/SQL может быть выполнен как в явном виде (вызов процедуры или функции), так и неявно (триггеры, автоматически срабатывающие при событиях DML — INSERT, UPDATE, DELETE). Архитектура включает:
- PL/SQL Engine — интерпретирует байт-код.
- SQL Engine — обрабатывает SQL-запросы внутри блоков PL/SQL.
- Shared Pool — область памяти, где кэшируется скомпилированный код для повторного использования.
Синтаксис и основные конструкции
PL/SQL — блочно-структурированный язык. Каждый блок состоит из трёх разделов: объявления (DECLARE), исполнения (BEGIN ... END) и обработки исключений (EXCEPTION). Блок может быть анонимным или именованным (процедура, функция, пакет).
Пример анонимного блока:
``sql DECLARE v_name VARCHAR2(50); BEGIN SELECT first_name INTO v_name FROM employees WHERE employee_id = 100; DBMS_OUTPUT.PUT_LINE('Employee: ' || v_name); EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE('No employee found'); END; ``
Основные конструкции:
- Переменные и константы — объявляются с типом данных (NUMBER, VARCHAR2, DATE, BOOLEAN и др.).
- Управляющие конструкции — IF-THEN-ELSIF-ELSE, CASE, LOOP (с WHILE, FOR, EXIT, CONTINUE).
- Коллекции — ассоциативные массивы (INDEX BY), вложенные таблицы (NESTED TABLE), массивы переменной длины (VARRAY).
- Курсоры — явные (DECLARE CURSOR) и неявные (FOR LOOP) для обработки наборов строк.
- Обработка исключений — системные (NO_DATA_FOUND, TOO_MANY_ROWS, DUP_VAL_ON_INDEX) и пользовательские (RAISE, RAISE_APPLICATION_ERROR).
- Подпрограммы — процедуры (PROCEDURE) и функции (FUNCTION), которые могут быть хранимыми или локальными.
Типы подпрограмм
Хранимые процедуры и функции
Хранимые процедуры и функции — это именованные блоки PL/SQL, которые компилируются и сохраняются в базе данных. Они могут принимать параметры (IN, OUT, IN OUT) и возвращать значения (функции — обязательно, процедуры — опционально через OUT-параметры). Пример:
``sql CREATE OR REPLACE FUNCTION get_salary(p_emp_id NUMBER) RETURN NUMBER IS v_salary employees.salary%TYPE; BEGIN SELECT salary INTO v_salary FROM employees WHERE employee_id = p_emp_id; RETURN v_salary; EXCEPTION WHEN NO_DATA_FOUND THEN RETURN NULL; END; ``
Пакеты
Пакет (PACKAGE) — это сгруппированный набор связанных процедур, функций, переменных, констант, курсоров и исключений. Пакет состоит из двух частей: спецификации (PUBLIC — интерфейс) и тела (PRIVATE — реализация). Пакеты позволяют инкапсулировать логику, управлять областью видимости, улучшать производительность (весь пакет загружается в память при первом вызове). Пример:
``sql CREATE OR REPLACE PACKAGE emp_pkg IS FUNCTION get_salary(p_emp_id NUMBER) RETURN NUMBER; PROCEDURE update_salary(p_emp_id NUMBER, p_new_salary NUMBER); END emp_pkg; ``
Триггеры
Триггеры — это хранимые блоки PL/SQL, которые автоматически выполняются при определённых событиях (INSERT, UPDATE, DELETE) на таблице или представлении, а также при системных событиях (LOGON, LOGOFF, DDL). Триггеры могут быть BEFORE, AFTER, INSTEAD OF, на уровне строки или оператора.
Типы данных
PL/SQL поддерживает все типы данных SQL (NUMBER, VARCHAR2, DATE, CLOB, BLOB и др.), а также собственные процедурные типы:
- BOOLEAN — логический тип (TRUE, FALSE, NULL).
- PL/SQL-записи — составные типы, объединяющие несколько полей (RECORD).
- Коллекции — ассоциативные массивы, вложенные таблицы, VARRAY.
- REF CURSOR — указатель на курсор, используемый для динамических запросов.
- Объектные типы — пользовательские типы с атрибутами и методами (с Oracle 8).
Применение
PL/SQL широко применяется в корпоративных информационных системах, построенных на Oracle Database, для:
- Реализации бизнес-логики — вычисления, проверки, преобразования данных, выполняемые на сервере.
- Пакетной обработки данных — массовые вставки, обновления, удаления с использованием циклов и коллекций.
- Генерации отчётов — формирование сложных выборок с агрегацией и форматированием.
- Интеграции с внешними системами — через UTL_FILE, UTL_HTTP, UTL_SMTP (работа с файлами, HTTP-запросами, почтой).
- Обеспечения целостности данных — триггеры для аудита, каскадных действий, проверки ограничений.
- Оптимизации производительности — уменьшение сетевого трафика (логика выполняется на сервере), кэширование результатов.
Преимущества и недостатки
Преимущества:
- Высокая производительность — код выполняется на сервере, минимизируя обмен данными с клиентом.
- Безопасность — бизнес-логика скрыта от клиента, доступ к данным контролируется через хранимые процедуры.
- Переносимость — код PL/SQL переносим между разными версиями Oracle Database.
- Интеграция с SQL — прямое использование SQL-запросов внутри процедурного кода.
- Поддержка транзакций — возможность управления транзакциями (COMMIT, ROLLBACK, SAVEPOINT).
Недостатки:
- Привязка к Oracle — PL/SQL не является стандартом ANSI/ISO, его реализация специфична для Oracle.
- Сложность отладки — отладка хранимого кода требует специальных инструментов (SQL Developer, PL/SQL Developer).
- Ограниченная переносимость — код PL/SQL не может быть легко перенесён на другие СУБД (например, PostgreSQL, MySQL).
- Сложность версионирования — управление версиями хранимого кода (особенно в больших проектах) может быть затруднено.
- Производительность при сложных вычислениях — PL/SQL уступает языкам общего назначения (C++, Java) в вычислительно-интенсивных задачах.
Инструменты разработки
Для разработки на PL/SQL используются:
- Oracle SQL Developer — бесплатная графическая среда от Oracle (редактор, отладчик, профилировщик).
- PL/SQL Developer (Allround Automations) — коммерческая среда с расширенными возможностями.
- Toad for Oracle (Quest) — коммерческая среда для администрирования и разработки.
- Oracle JDeveloper — среда для Java и PL/SQL.
- Командная строка — SQL*Plus (утилита Oracle) для выполнения скриптов.
Версии и совместимость
PL/SQL развивается вместе с Oracle Database. Основные версии:
- Oracle 6 (1991) — первая версия PL/SQL.
- Oracle 7 (1992) — хранимые процедуры, функции, пакеты.
- Oracle 8 (1997) — объектно-ориентированные возможности.
- Oracle 9i (2001) — коллекции, улучшенная обработка исключений.
- Oracle 10g (2003) — поддержка XML, улучшенная производительность.
- Oracle 11g (2007) — условная компиляция, улучшенная обработка ошибок.
- Oracle 12c (2013) — поддержка SQL в пакетном режиме, автономные транзакции.
- Oracle 18c (2018) — улучшения в области безопасности и производительности.
- Oracle 19c (2019) — стабильная версия с долгосрочной поддержкой.
- Oracle 21c (2021) — новые возможности для аналитики и блокчейна.
Альтернативы PL/SQL
В других СУБД существуют аналоги PL/SQL:
- T-SQL (Transact-SQL) — процедурное расширение для Microsoft SQL Server и Sybase ASE.
- PL/pgSQL — процедурное расширение для PostgreSQL.
- PL/SQL (IBM Db2) — адаптированная версия для Db2.
- MySQL Stored Procedures — процедурное расширение для MySQL (основано на SQL/PSM).
- Java Stored Procedures — возможность писать хранимые процедуры на Java в Oracle Database.
Интересные факты
- PL/SQL изначально разрабатывался под кодовым названием «Pro*SQL» (Procedural SQL).
- В 1990-х годах PL/SQL был одним из первых языков, реализовавших концепцию «хранимой логики» в коммерческих СУБД.
- В Oracle Database 11g была добавлена возможность компиляции PL/SQL в нативный машинный код (C) для повышения производительности.
- PL/SQL поддерживает рекурсию — процедуры и функции могут вызывать сами себя.
- Существуют компиляторы PL/SQL для сторонних платформ (например, PL/SQL для .NET), но они не получили широкого распространения.
Источники
- Oracle Database PL/SQL Language Reference (документация Oracle)
- Oracle Database Concepts Guide
- «Oracle PL/SQL Programming» (Steven Feuerstein, Bill Pribyl)
- «Expert Oracle PL/SQL» (Ron Hardman, Michael McLaughlin)
- Материалы конференций Oracle OpenWorld, Oracle Code
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →