- •1. Создадим таблицу для шапки счетов. Вводим команду.
- •Удаление таблицы
- •Подготовка скрипта для создания всех таблиц
- •Р исунок 1. Таблица exdoc с дубликатами.
- •Язык манипулирования данными
- •Команда select
- •Тестовый набор данных
- •Добавление записи в таблицу exdoc
- •Расчёт суммы за товар
- •Расчёт стоимости услуг упаковки
- •4. Можно на калькуляторе сложить все полученные значения и записать в таблицу услуг. Но…
- •5. Рассчитываем сумму услуг упаковки для всех позиций счёта. Отредактируем команду следующим образом.
- •6. Напишем команду, которая запишет рассчитанное значение в таблицу с услугами.
- •Расчёт услуг доставки
- •3. Запишем стоимость доставки в таблицу.
- •Расчёт общих сумм по счёту
- •Типы правил проверки данных
- •Практическая польза от уникальности записей
- •Обязательные для заполнения колонки
- •Дублирование записей
- •Создание первичного ключа
- •Пересоздание таблицы с позициями счетов
- •Добавим проверку значений
- •Правка таблицы с услугами
- •Создание последовательности
- •Начало и завершение транзакции
- •Проверка команды rollback
- •Выполнение команд с ошибками
- •Язык pl/sql
- •Команды программы sql*Plus
Правка таблицы с услугами
Пересоздадим таблицу с услугами exsvc. В команду CREATE TABLE добавим ограничения: обязательные колонки; проверки на допустимые значения; первичный ключ; правило ссылочной целостности.
1. drop table exsvc;
2. Откроем в редакторе файл cre_exsvc, исправим текст команды и запишем под новым именем cre_exsvc2.sql
edit cre_exsvc
create table exsvc
( doc_nd number ( 6) not null
, doc_dd date not null
, service_n varchar2( 60) check( service_n in ( 'услуги доставки'
, 'услуги упаковки'))
, cost number ( 12, 2)
, tax number ( 5, 2) check( tax in (10,18))
, sum_tax number ( 12, 2)
, sum_svc number ( 12, 2)
, constraint pk_exsvc
primary key(doc_nd, doc_dd, service_n)
, constraint fk_exsvc_exdoc
foreign key(doc_nd, doc_dd)
references exdoc (doc_nd, doc_dd)
)
Для колонки service_n добавили проверку по списку значений. Использовали оператор IN с перечислением строковых констант.
Правила для первичного ключа и ссылочной целостности записали после списка колонок.
3. Создадим таблицу.
@cre_exsvc2
4. Добавим запись.
@ins_exsvc1
5. Введём команду.
select *
from exsvc
where doc_nd = 137
and doc_dd = ‘12-sep-2003’
and service_n = ‘услуги упаковки’;
При "длинном" первичном ключе команда SQL для поиска нужной записи становиться тоже "длинной". Удобно?
6. Создадим суррогатный первичный ключ. Удалим существующий ключ.
alter table exsvc drop constraint pk_exsvc;
Таблица изменена.
Команда ALTER TABLE позволяет удалять правила-ограничения. При удалении нужно указывать имя правила, то, которое задали при создании.
7. Запомним команду.
save alt_exsvc1
8. Добавим колонку "код записи".
alter table exsvc add exsvc_c number(9) not null primary key;
Таблица изменена.
Используем команду ALTER TABLE для добавления колонок в существующую таблицу. Для колонки можно указать правила целостности.
Особенности.
Добавить колонку обязательную для заполнения можно только в пустую таблицу.
Для составного первичного ключа нужно писать свою команду ALTER TABLE.
В этой команде не указано имя для первичного ключа. Если в команде ALTER TABLE опущена конструкция constraint, то имя будет сгенерировано базой данных.
9. Добавленная колонка будет в описании таблицы последней.
desc exsvc
10. Запомним команду.
save alt_exsvc2
11. Естественный первичный ключ желательно оставить, создадим альтернативный ключ.
alter table exsvc
add constraint ak_exsvc
unique (doc_nd, doc_dd, service_n);
Добавили правило – проверка уникальности значений unique. Уникальная комбинация задаётся тремя колонками.
12. save alt_exsvc3
Создание последовательности
1. Для генерации значений первичного ключа используется специальный механизм - последовательность. Вводим команду.
create sequence seq_exsvc start with 1;
Последовательность, SEQUNCE – счётчик значений. Используется для генерации набора значений.
Создается командой CREATE SEQUENCE. В команде обязательно указать имя, например, seq_exsvc.
С помощью различных опций можно настроить порядок формирования значений. В нашей команде задано - генерировать последовательность целых чисел, начиная с единицы, шаг по умолчанию равен 1. Последовательность вернёт набор чисел: 1, 2, 3, 4, 5, …
2. Сохраним команду в файл.
save cre_seq
3. Введём команду.
select seq_svc.NEXTVAL from dual;
Команда вернула одну строку и какое-то значение.
Будем разбираться.
Это обычный SELECT. Чтение данных выполняется из "доселе неизвестной" таблицы dual.
dual – это таблица, в которой одна колонка и одна запись. В ней хранится одно и тоже значение. Его изменить нельзя. В базе данных только одна таблица с именем dual, но она доступна для всех, всегда под рукой. Если пишем SELECT к этой таблице, то он всегда возвращает одну и только одну запись.
Последовательность тоже можно представить как таблицу с одной строкой и одной колонкой. В базе данных может быть много последовательностей. У всех последовательностей колонка имеет одно и тоже имя - NEXTVAL. Эту колонку называют псевдоколонкой. Значение не хранится на диске, оно вычисляется при каждом обращении. В случае с последовательностью – псевдоколонка NEXTVAL будет вычислять и возвращать следующее значений из набора чисел.
Вспомните view, конструкцию FROM-SELECT. Для ссылки на значение использовали запись “v.weight”, имя таблицы и через точку имя колонки. Для чтения значения из последовательности используем такую же запись seq_svc.NEXTVAL
Получается, что команда SELECT читает записи из таблицы dual. Возвращает одну запись, но не использует значение из этой записи, а вычисляет выражение - извлечь следующие значение из последовательности.
Последовательность каждый раз будет возвращать новое значение.
4. Выполните запрос ещё раз. Введите "/".
5. И ещё раз "/".
Значение каждый раз новое.
6. Смотрите, что в таблице dual.
select * from dual;
7. Посмотрим последнее выбранное значение в последовательности.
select seq_svc.CURRVAL from dual;
Действительно, это то значение.
Псевдоколонка CURRVAL возвращает последнее значение из последовательности.
8. Повторите команду. Значение не изменилось. Это всё тоже последнее значение.
9. Исправим команды для добавления записей с услугами. Добавим колонку и обращение к последовательности.
edit ins_exsvc1
insert into exsvc
( exsvc_c
, doc_nd
, doc_dd
, service_n
, tax
)
values
( seq_exsvc.NEXTVAL
, 137
, '12-sep-2003'
, 'услуги доставки'
, 18)
/
Обратите внимание. Список колонок в команде может отличаться от того, который выводится командой desc.
10. Отредактируем файл с услугами упаковки.
edit ins_exsvc2
insert into exsvc
( exsvc_c
, doc_nd
, doc_dd
, service_n
, tax
)
values
( seq_exsvc.NEXTVAL
, 137
, '12-sep-2003'
, 'услуги упаковки'
, 18)
/
Воспользуемся скриптами тестового набора: почистим таблицы; добавим тестовые данные; посмотрим результат.
11. @del_ex
12. @ins_ex
13. @show_ex
Тестовый набор прошел проверку? Удовлетворяет он ограничениям?
Домашнее задание
Подготовить скрипт ins_ex. Объединить все команды для ввода тестового набора в один большой файл. Проверить работу скрипта.
Теперь знаем
Язык описания данных DDL:
значение NULL, колонка NOT NULL
ALTER TABLE modify
ALTER TABLE add column
ALTER TABLE add constraint check
ALTER TABLE add constraint primary key
ALTER TABLE add constraint foreign key
ALTER TABLE add constraint unique
ALTER TABLE drop constraint
CREATE TABLE с NOT NULL и constraint
CREATE SEQUENCE
Язык манипулирования данными DML:
INSERT по SELECT
SELECT DISTINCT
псевдоколонки NEXTVAL, CURRVAL
полезная таблица dual
Лекция 10: Транзакции.
Транзакция
Н а предыдущих уроках мы создали таблицы и написали скрипт для ввода тестового набора данных. Скрипт содержит последовательность команд INSERT и UPDATE.
Рисунок 1. Транзакция.
Нужно быть готовыми к тому, что какая-нибудь из команд этого скрипта может выполниться с ошибкой. В этом случае данные в таблицах будут некорректные. Нельзя сказать, что мы правильно ввели тестовый пример. Более того, нам нужно будет как-то исправлять ситуацию.
Очевидно, что после выполнения скрипта мы должны каким-то образом подтвердить, что результат выполнения команд нас устраивает.
Если мы отказываемся от этих изменений, то мы должны сказать, изменения каких команд должно быть отменено.
Такая последовательность команд на изменение записей в таблицах называется транзакцией. У этой последовательности есть момент начала и есть момент завершения.