Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по Ораклу.doc
Скачиваний:
1
Добавлен:
10.08.2019
Размер:
467.46 Кб
Скачать

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”, т.е. перед названием колонки ставим имя представления и отделяем точкой.