- •1. Создадим таблицу для шапки счетов. Вводим команду.
- •Удаление таблицы
- •Подготовка скрипта для создания всех таблиц
- •Р исунок 1. Таблица exdoc с дубликатами.
- •Язык манипулирования данными
- •Команда select
- •Тестовый набор данных
- •Добавление записи в таблицу exdoc
- •Расчёт суммы за товар
- •Расчёт стоимости услуг упаковки
- •4. Можно на калькуляторе сложить все полученные значения и записать в таблицу услуг. Но…
- •5. Рассчитываем сумму услуг упаковки для всех позиций счёта. Отредактируем команду следующим образом.
- •6. Напишем команду, которая запишет рассчитанное значение в таблицу с услугами.
- •Расчёт услуг доставки
- •3. Запишем стоимость доставки в таблицу.
- •Расчёт общих сумм по счёту
- •Типы правил проверки данных
- •Практическая польза от уникальности записей
- •Обязательные для заполнения колонки
- •Дублирование записей
- •Создание первичного ключа
- •Пересоздание таблицы с позициями счетов
- •Добавим проверку значений
- •Правка таблицы с услугами
- •Создание последовательности
- •Начало и завершение транзакции
- •Проверка команды rollback
- •Выполнение команд с ошибками
- •Язык pl/sql
- •Команды программы sql*Plus
Начало и завершение транзакции
Транзакция по умолчанию начинается с первой команды, которая изменяет записи в таблицах. Напомню, к этим командам относятся INSERT, UPDATE, DELETE. В момент начала транзакции ORACLE запоминает первую команду и приступает к протоколированию изменений. При этом команды внутри транзакции будут учитывать изменения, которые сделаны предыдущими командами. Это относится и к команде SELECT внутри транзакции.
На примере добавления тестового набора, мы видели, что команды UPDATE используют данные, которые были "только что" занесены командой INSERT.
Если команда SELECT выполняется вне транзакции, то она не начинает транзакцию, потому что она не изменяет данные. Только читает их из таблиц.
Транзакция всегда завершается. Это происходит либо явно, либо неявно.
Явное завершение - когда пользователь вводит команду COMMIT, либо команду ROLLBACK.
Транзакция может быть завершена с фиксацией изменений или с отменой. Команда COMMIT фиксирует изменения, команда ROLLBACK отменяет все сделанные изменения.
Если в момент завершения мы дадим команду отмены, то наше состояние вернётся в состояние перед началом транзакции.
Неявное завершение транзакции - когда пользователь не вводит команду COMMIT или ROLLBACK. Такое завершение транзакции происходит, когда пользователь вводит команду языка описания данных DML, либо когда он прекращает сеанс, а точнее разрывает его. Например, закрывает программу SQL*Plus по кнопке "Закрыть окно" или клавиатурной комбинацией ALT+F4, или когда по сети происходит сбой и соединение разрывается.
Пакетная передача команд
С нова вернемся к скрипту в учебном примере. Рассмотрим, как он работает. Программа-клиент последовательно выполняет команды из скрипта. Каждая команда передаётся на сервер базы данных и там выполняется. После завершения команды сервер возвращает результат её работы и код завершения. Либо команда завершилась хорошо, без ошибки, либо с ошибкой.
Рисунок 2. Выполнение PL/SQL блока.
Этот способ предполагает активное взаимодействие программы-клиента и сервера базы данных. Такое взаимодействие приводит к увеличению сетевого трафика, времени выполнения скрипта. Потреблению дополнительных ресурсов (памяти, процессорного времени). Кроме того, интенсивное взаимодействие по сети двух программ приводит к увеличению рисков сбоя.
Есть альтернатива. Можно передать на сервер все команды за один раз. Пакетная передача может быть осуществлена с помощью PL/SQL блоков, т.е. небольшой программы на языке программирования PL/SQL.
Для оформления наших команд в форме блока достаточно в начале дописать ключевое слово BEGIN и закончить последовательность команд словом END. Таким образом, все команды будут записаны между ключевыми словами BEGIN и END. Программа-клиент передаёт текст блока серверу базы данных за одно обращение, т.е. весь список команд передаётся один раз. Сервер выполняет все команды в блоке и после этого возвращает код завершения.
Преимущество пакетной передачи команд в том, что уменьшаются риски сбоя, время выполнения скрипта, потребность в вычислительных ресурсах.
При создании таблиц мы исходили из того, что в них будут храниться записи нескольких счетов. Мы подготовили скрипт, который вводит тестовый набор данных в таблицы. Но при этом мы не учитывали тот факт, что в таблице будут записи разных счетов. В этом уроке мы скрипт доработаем. Ограничим действие команд рамками одного счёта, причём того, с которым работаем. Для этого припишем условия к командам изменения записей UPDATE.
Для этого урока я подготовил файл ins_ex. Он содержит все команды для добавления тестового набора. Перенёс команды из нескольких файлов в один большой.