- •1. Создадим таблицу для шапки счетов. Вводим команду.
- •Удаление таблицы
- •Подготовка скрипта для создания всех таблиц
- •Р исунок 1. Таблица exdoc с дубликатами.
- •Язык манипулирования данными
- •Команда select
- •Тестовый набор данных
- •Добавление записи в таблицу exdoc
- •Расчёт суммы за товар
- •Расчёт стоимости услуг упаковки
- •4. Можно на калькуляторе сложить все полученные значения и записать в таблицу услуг. Но…
- •5. Рассчитываем сумму услуг упаковки для всех позиций счёта. Отредактируем команду следующим образом.
- •6. Напишем команду, которая запишет рассчитанное значение в таблицу с услугами.
- •Расчёт услуг доставки
- •3. Запишем стоимость доставки в таблицу.
- •Расчёт общих сумм по счёту
- •Типы правил проверки данных
- •Практическая польза от уникальности записей
- •Обязательные для заполнения колонки
- •Дублирование записей
- •Создание первичного ключа
- •Пересоздание таблицы с позициями счетов
- •Добавим проверку значений
- •Правка таблицы с услугами
- •Создание последовательности
- •Начало и завершение транзакции
- •Проверка команды rollback
- •Выполнение команд с ошибками
- •Язык pl/sql
- •Команды программы sql*Plus
4. Можно на калькуляторе сложить все полученные значения и записать в таблицу услуг. Но…
лучше напишем такую команду.
select good_n
, DECODE( good_n
, 'Банки стеклянные', quant
, 'Горшки цветочные', quant * 1.7
, 'Пробка медицинская', round( quant / 10) * 1.5)
as cost
from expos;
Конструкции WHERE нет, поэтому будут выведены все записи. Для каждой будет выведено два значения: название товара и рассчитанная стоимость услуг упаковки.
Арифметическое выражение использует функцию DECODE. Она работает так. Берётся первый аргумент, в данном случае значение из колонки good_n, и сравнивается с символьными константами. При совпадении значений вычисляется выражение, которое записано после константы.
Команда выводит четыре строки. В колонке cost видим ранее рассчитанные значения. Для товара "Грунт для цветов" значение не выведено. В функции DECODE нет правила для товара с таким названием, поэтому оно равно NULL.
5. Рассчитываем сумму услуг упаковки для всех позиций счёта. Отредактируем команду следующим образом.
edit
select SUM( DECODE( good_n
, 'Банки стеклянные', quant
, 'Горшки цветочные', quant * 1.7
, 'Пробка медицинская', round( quant / 10) * 1.5))
from expos;
Выполним команду.
Получили одну запись с одной колонкой. На экран выведено значение стоимости услуг упаковки для всех позиций счёта. Сравним его с контрольным значением в форме счёта из учебного примера.
Особенности команды. Удалили колонку с названием товара и добавили функцию SUM. Эта функция выполняет накопительное суммирование, т.е. складывает значения одной колонки в группе записей. Поэтому введённая команда обрабатывает все записи таблицы, но на экран выводит только одну строку.
6. Напишем команду, которая запишет рассчитанное значение в таблицу с услугами.
edit
update exsvc
set cost =
(
select SUM(DECODE( good_n
, 'Банки стеклянные', quant
, 'Горшки цветочные', quant * 1.7
, 'Пробка медицинская', round( quant / 10) * 1.5))
from expos
)
where service_n like '%упаковки%';
Выполним команду. Изменена одна запись.
Команда UPDATE используется для внесения изменений в записи таблицы exsvc, у которых значение в колонке service_n содержит слово "упаковки". В нашем случае это одна запись.
Изменяется значение в колонке cost. Оно будет рассчитано с помощью подзапроса – это команда SELECT, заключенная в круглые скобки. Обращаю внимание, что подзапрос должен возвращать одну строку с одной колонкой. Не больше и не меньше.
7. Запишем команду в файл.
save upd_svc1
8. Смотрим записи в таблице exsvc.
select * from exsvc;
Для одной записи рассчитана стоимость услуг.
Расчёт услуг доставки
1. Приступаем к расчёту стоимости доставки. Находим общий вес товара по счёту. Вводим команду.
select sum( decode( good_n
, 'Банки стеклянные', quant *0.1
, 'Горшки цветочные', quant * 1.2
, 'Пробка медицинская', round( quant / 10) * 0.85
, 'Грунт для цветов', quant)
) as weight
from expos;
Выполним. Вес товара по счёту 167.35 кг.
Этот запрос аналогичен предыдущему. Коэффициенты берём из справочной таблицы. Хотя грунт для цветов отсутствует в ней, мы будем учитывать его вес, т.е. количество задано в колонке quant.
2. В зависимости от веса должны определить стоимость доставки.
edit
select case
when 0 <= v.weight and v.weight < 100 then 1.8
when 100 <= v.weight and v.weight < 200 then 4.7
when 200 <= v.weight then 6
else 0
end
as cost
from (
select sum( decode( good_n
, 'Банки стеклянные', quant * 0.1
, 'Горшки цветочные', quant * 1.2
, 'Пробка медицинская', round( quant / 10) * 0.85
, 'Грунт для цветов', quant)
) as weight
from expos
) v;
Выполним команду. Стоимость доставки равна 4.70 руб.
Команда SELECT, которая рассчитывает вес товара по счёту, обрамлена круглыми скобками и написана в конструкции FROM. Команда SELECT, написанная в конструкции FROM, называется view, по-русски - представление. Сразу после закрывающей скобки указывается имя, по которому можно обращаться к колонкам представления.
Уже знаем, что команда SELECT умеет читать записи из таблицы, но в нашем случае команда SELECT выполняет чтение записей из результирующего набора, который подготовлен другой командой SELECT, написанной в конструкции FROM.
Представлению присвоено имя из одного символа “v”. Оно возвращает одну запись с одной колонкой “weight”.
В зависимости от веса товаров определяем стоимость доставки. Для расчёта используем конструкцию CASE. Как и функция DECODE, она позволяет выполнить проверку нескольких условий. Каждое условие начинается с ключевого слова WHEN. Если оно выполняется, то берётся значение, которое записано после ключевого слова THEN для этого условия. Если не выполняется ни одно условие, то берётся значение после ELSE.
Отличие в условиях. В DECODE выполняется сравнение какого-либо значения с константами, а в CASE можно использовать условия такие же, как в конструкции WHERE. Причём мы используем сложные условия: два простых правила сравнения объединены операцией and, т.е. условие будет истинным при соблюдении обоих правил.
Для обращения к значению в представлении используем запись “v.weight”, т.е. перед названием колонки ставим имя представления и отделяем точкой.