- •1. Создадим таблицу для шапки счетов. Вводим команду.
- •Удаление таблицы
- •Подготовка скрипта для создания всех таблиц
- •Р исунок 1. Таблица exdoc с дубликатами.
- •Язык манипулирования данными
- •Команда select
- •Тестовый набор данных
- •Добавление записи в таблицу exdoc
- •Расчёт суммы за товар
- •Расчёт стоимости услуг упаковки
- •4. Можно на калькуляторе сложить все полученные значения и записать в таблицу услуг. Но…
- •5. Рассчитываем сумму услуг упаковки для всех позиций счёта. Отредактируем команду следующим образом.
- •6. Напишем команду, которая запишет рассчитанное значение в таблицу с услугами.
- •Расчёт услуг доставки
- •3. Запишем стоимость доставки в таблицу.
- •Расчёт общих сумм по счёту
- •Типы правил проверки данных
- •Практическая польза от уникальности записей
- •Обязательные для заполнения колонки
- •Дублирование записей
- •Создание первичного ключа
- •Пересоздание таблицы с позициями счетов
- •Добавим проверку значений
- •Правка таблицы с услугами
- •Создание последовательности
- •Начало и завершение транзакции
- •Проверка команды rollback
- •Выполнение команд с ошибками
- •Язык pl/sql
- •Команды программы sql*Plus
Проверка команды rollback
1. Убедимся, что в таблицах ничего нет.
@show_ex
2. Запустим скрипт с тестовым набором.
@ins_ex
Скрипт выполнен без ошибок. Первая команда INSERT из скрипта открывает транзакцию.
3. Смотрим содержимое таблиц.
@show_ex
Данные тестового набора добавлены в таблицу.
Обращаю внимание. Сейчас транзакция открыта. Команды SELECT выводят информацию с учетом изменений, которые сделаны скриптом ins_ex.
4. Вводим команду.
rollback;
Команда выполнена.
Транзакция явно завершена. Изменения отменены, т.е. тестового набора в таблицах не должно быть.
5. Убедимся в том, что таблицы пустые.
@show_ex
Действительно пустые.
Команда ROLLBACK завершила транзакцию с откатом изменений. Видим, что всё вернулось в исходное состояние, тестового набора нет.
Команда COMMIT
Проверим команду явного завершения транзакции с фиксацией изменений. Команда COMMIT.
1. Таблицы пустые. Добавим тестовый набор.
@ins_ex
Транзакция началась.
2. Убедимся, что тестовый набор добавлен.
@show_ex
Данные добавлены. Транзакция открыта.
3. Вводим команду.
commit;
Команда выполнена.
Транзакция явно завершена. Изменения зафиксированы.
4.Смотрим…
@show_ex
…данные присутствуют. Изменения сохранены.
Неявное завершение транзакции
Проверим неявное завершение транзакции с отменой изменений.
1. Исходное состояние – тестовый набор в таблицах. Удалим его.
@del_ex
Скрипт выполнен без ошибок.
Транзакция началась – первая команда DELETE начинает транзакцию.
2. Убедимся, что данных нет.
@show_ex
Таблицы пусты.
Транзакция открыта. Команда SELECT внутри транзакции учитывает изменения предыдущих команд.
3. Разорвем сеанс. Закрываем программу SQL*Plus либо щелчком на кнопке "Закрыть окно", либо одновременно нажимаем комбинацию клавиш ALT и F4.
Разорвали сеанс - это не явное завершение транзакции с отменой изменений, т.е. неявный rollback;
4. Запускаем программу SQL*Plus и подключаемся к базе данных.
5. Смотрим содержимое таблиц.
@show_ex
Тестовый набор на месте. Другими словами, действие команд DELETE отменено, разрыв сеанса привел к завершению транзакции и откату изменений.
Выполнение команд с ошибками
Пусть транзакция состоит из последовательности команд. Рассмотрим случай, когда одна из них выполнилась с ошибкой.
1. Вносим изменения в файл ins_ex. Умышленно делаем ошибку, меняем местами номер и дату документа в команде добавления услуг упаковки, т.е. в середине последовательности команд.
Откроем файл в текстовом редакторе. Найдем команду и внесем изменения. Запишем команду в файл с другим именем, например, ins_ex1.sql.
edit ins_ex
insert into exsvc
( exsvc_c
, doc_nd
, doc_dd
, service_n
, tax)
values
( seq_exsvc.NEXTVAL
, '12-sep-2003'
, 137
, 'услуги упаковки'
, 18)
2. Почистим таблицы.
@del_ex
Транзакция началась.
3. Продолжаем транзакцию. Выполним скрипт, который содержит ошибку.
@ins_ex1
Одна из команд выполнена с ошибкой.
Обращаю внимание. При возникновении ошибки выполнение скрипта продолжилась. Команды после сбоя отработали без ошибок. Смотрите сообщения.
4. Завершаем транзакцию.
commit;
5. Смотрим результат.
@show_ex
Данные в таблицах есть, но это не тестовый набор. Другими словами, сбой всего в одной команде привел к некорректному добавлению тестового набора.
Вывод: программист должен после каждой команды проверять код завершения и принимать решение о продолжении или завершении транзакции.
Ещё вывод: команды завершения транзакции только закрывают транзакцию. Они не проверяют коды выполнения команд, составляющих транзакцию.
И ещё: фиксируются изменения только тех команд, которые выполнились без ошибок. Изменения будут зафиксированы, даже если одна или несколько команд, входящих в транзакцию, выполнились с ошибками.
Памятка по работе с ORACLE
В скобках указан номер лекции.
Язык описания данных DDL
CREATE TABLE (2)
CREATE TABLE с NOT NULL и constraint (4)
DROP TABLE (2)
типы данных: number, varchar2, date (2)
значение NULL, колонка NOT NULL (4)
ALTER TABLE modify (4)
ALTER TABLE add column (4)
ALTER TABLE add constraint check (4)
ALTER TABLE add constraint primary key (4)
ALTER TABLE add constraint foreign key (4)
ALTER TABLE add constraint unique (4)
ALTER TABLE drop constraint (4)
CREATE SEQUENCE (4)
CREATE OR REPLACE PROCEDURE (6)
CREATE FUNCTION (6)
CREATE OR REPLACE PACKAGE (7)
CREATE PACKAGE BODY (7)
Язык управления данными DML
запись констант (3)
арифметические выражения (3)
значение NULL (3)
INSERT (3)
INSERT по SELECT (4)
DELETE (3)
UPDATE (3)
UPADTE нескольких колонок подзапросом SELECT (3)
SELECT * FROM (3)
SELECT <список колонок> FROM (3)
SELECT DISTINCT (4)
SELECT FROM (SELECT …) (3)
алиас колонки as (3)
алиас представления (3)
WHERE уcловия с LIKE (3)
WHERE с несколькими условиями, объединены AND (5)
ORDER BY (3)
стандартные функции ROUND, DECODE (3)
использование пользовательских функций в SELECT (6)
выражение CASE (3)
функция накопительного суммирование SUM (3)
псевдоколонки NEXTVAL, CURRVAL (4)
COMMIT (5)
ROLLBACK (5)
полезная таблица dual (4)