Пошаговое обучение PL SQL для начинающих

Как выучить pl sql

Как выучить pl sql

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

Для работы с PL SQL требуется установить Oracle Database и клиентские инструменты для разработки, такие как SQL*Plus или Oracle SQL Developer.

  1. Установка Oracle Database:

    • Скачайте версию Oracle Database с официального сайта Oracle. Для обучения подойдет Oracle Database Express Edition (XE) – бесплатная и легковесная версия.
    • Запустите установщик и следуйте инструкциям. Выберите тип установки «Desktop class» для упрощенной конфигурации.
    • Установите пароль администратора (SYSTEM) и запомните его для доступа к базе данных.
    • Проверьте работу сервера: откройте командную строку и выполните sqlplus system@XE для подключения к базе.
  2. Установка Oracle SQL Developer:

    • Скачайте последнюю версию SQL Developer с официального сайта Oracle.
    • Распакуйте архив в удобное место. Дополнительно установка Java не требуется, так как пакет поставляется с JDK.
    • Запустите SQL Developer и создайте новое подключение к базе данных, используя логин SYSTEM и пароль, указанный при установке Oracle Database.
  3. Настройка среды:

    • Создайте отдельного пользователя базы данных для работы с 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. Все инструменты позволяют одновременно писать код и тестировать его выполнение на реальной базе данных.

Создание и выполнение первых 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 позволяют повторять блоки кода. Основные типы циклов:

  1. LOOP – бесконечный цикл с обязательным использованием EXIT для выхода:


DECLARE
  i NUMBER := 1;
BEGIN
  LOOP
    DBMS_OUTPUT.PUT_LINE('Итерация: ' || i);
    i := i + 1;
    EXIT WHEN i > 5;
  END LOOP;
END;

  1. WHILE – проверка условия перед каждой итерацией:


DECLARE
  i NUMBER := 1;
BEGIN
  WHILE i <= 5 LOOP
    DBMS_OUTPUT.PUT_LINE('Итерация: ' || i);
    i := i + 1;
  END LOOP;
END;

  1. 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

В 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. Сначала стоит научиться писать простые анонимные блоки, которые выполняют арифметические операции или выводят сообщения. После этого можно переходить к созданию процедур и функций, работать с курсорами и обрабатывать исключения. Практика на простых примерах помогает закрепить синтаксис и понять логику работы с базой данных, прежде чем переходить к более сложным сценариям.

Ссылка на основную публикацию