Форум программистов, компьютерный форум, киберфорум
Oracle
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 5.00/18: Рейтинг темы: голосов - 18, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 24.11.2014
Сообщений: 47
1

Триггер для подсчёта стоимости всего заказа

07.05.2015, 21:00. Показов 3245. Ответов 27
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
подскажите пожалуйста нужно написать триггер для подсчёта стоимости всего заказа, которая состоит из данных которые берутся из трёх таблиц и в поле четвертой таблицы должны посчитаться
вот как делаю, но не работает:
Oracle 11 SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
CREATE OR REPLACE TRIGGER price
before INSERT OR UPDATE OF price_zakaz ON zakaz
FOR each ROW
DECLARE
price_tovar tovar.price%TYPE;
price_uslug uslugi.price%TYPE;
BEGIN
 SELECT price INTO price_tovar
  FROM tovar
  WHERE tovar.id_tovar=:NEW.id_tovar;
 
 SELECT price INTO price_uslug
  FROM uslugi inner join zakaz_uslugi ON
  uslugi.id_uslugi=zakaz_uslugi.id_uslugi
  
  WHERE zakaz_uslugi.id_zakaz=:NEW.id_zakaz;
 
:NEW.price_zakaz:=price_uslug*zakaz_uslugi.kol_vo_zakaz+price_tovar;
END;
подскажите что не так
Миниатюры
Триггер для подсчёта стоимости всего заказа  
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.05.2015, 21:00
Ответы с готовыми решениями:

Триггер для подсчета общей стоимости заказа
Нужно подсчитать общую стоимость заказа. Формула подсчета выглядит так: 100 * Количество дисков *...

Триггер на сумму заказа
у меня есть 3 таблицы t1: t1_id, t1_name, t1_price t2: t2_id, t2_fio t3: t3_id, t3_t2_id,...

Я наверное схожу с ума: всего лишь INSTEAD OF-триггер
Привет всем. у меня есть одна вьюшка которая отображает данные из двух таблиц При попытке создать...

Описать метод для подсчёта стоимости заказа
a) Разработать класс с соответствующими полями b) Предусмотреть инициализацию с проверкой...

27
Модератор
4217 / 3058 / 583
Регистрация: 21.01.2011
Сообщений: 13,205
08.05.2015, 09:45 2
Цитата Сообщение от XAKEP Посмотреть сообщение
не работает
Для начала расшифруй, что это значит.
0
0 / 0 / 0
Регистрация: 24.11.2014
Сообщений: 47
08.05.2015, 09:48  [ТС] 3
что именно объяснить?
0
Модератор
4217 / 3058 / 583
Регистрация: 21.01.2011
Сообщений: 13,205
08.05.2015, 09:53 4
Цитата Сообщение от XAKEP Посмотреть сообщение
что именно объяснить?
Что такое "не работает"? Выдает какую-то ошибку при компиляции, выдает ошибку в runtime или ошибок нет, но и нужного результата нет? Любое сообщение об ошибке предоставляет инфу для поиска этой самой ошибки.
0
0 / 0 / 0
Регистрация: 24.11.2014
Сообщений: 47
08.05.2015, 10:17  [ТС] 5
да выдаёт ошибку:

PLS-00357: Table,View Or Sequence reference 'ZAKAZ_USLUGI.KOL_VO_ZAKAZ' not allowed in this context
0
Модератор
4217 / 3058 / 583
Регистрация: 21.01.2011
Сообщений: 13,205
08.05.2015, 10:22 6
Цитата Сообщение от XAKEP Посмотреть сообщение
да выдаёт ошибку
Вполне логично. С какой стати ты напрямую, без SELECT-а обращаешься к полю таблицы?

PS
Кстати, обрати внимание. При простом просмотре текста эту фишку можно и пропустить. А сообщение сразу тыкает в нужное место.
0
0 / 0 / 0
Регистрация: 24.11.2014
Сообщений: 47
08.05.2015, 10:50  [ТС] 7
что вы хотите этим сказать, что я должен вместо zakaz_uslugi.kol_vo_zakaz написать запрос?
0
Модератор
4217 / 3058 / 583
Регистрация: 21.01.2011
Сообщений: 13,205
08.05.2015, 11:00 8
Цитата Сообщение от XAKEP Посмотреть сообщение
я должен вместо zakaz_uslugi.kol_vo_zakaz написать запрос?
Запрос к этой таблице у тебя уже есть, просто надо это поле вытащить в еще одну переменную.

Немного теории. Так исторически сложилось, что в Oracle есть 2 машины (engine): SQL и PL/SQL. Если в тексте PL/SQL встречается SQL-запрос, то происходит переключение на SQL engine и идет обращение к объектам БД. В частности, Oracle формирует доп. запросы к словарю (т.н. рекурсивный SQL), чтобы определить, есть ли такая таблица (которая упоминается в запросе). Если SQL-запроса нет, то работает PL/SQL engine, которая ищет все упоминаемые имена внутри блока PL/SQL. Обрати внимание, что Oracle тебе сказал неопределенно, что это за объект (view, table or sequence). Это именно потому, что он не лез в словарь, чтобы понять, что это такое, а высказал предположение, исходя из контекста. Другими словами: пока нет SQL-запроса, работа идет с переменными, как в любом другом языке программирования. Если ты хочешь обратиться к таблицам, то обязательно нужен SQL-запрос.
0
0 / 0 / 0
Регистрация: 24.11.2014
Сообщений: 47
08.05.2015, 11:05  [ТС] 9
теория это конечно хорошо, ноя недавно начал разбираться с этими вещами, вы бы не могли подсказать, как это выглядело бы на практике? вот как я понял вас:
Кликните здесь для просмотра всего текста

select kol_vo_zakaz into kol_vo from zakaz_uslugi;
:new.price_zakaz:=price_uslug*kol_vo+price_fotosessiya;
end;
0
Модератор
4217 / 3058 / 583
Регистрация: 21.01.2011
Сообщений: 13,205
08.05.2015, 11:13 10
Цитата Сообщение от XAKEP Посмотреть сообщение
вот как я понял вас
В приведенном тобой SELECT-е отсутствует WHERE, поэтому в общем случае будет несколько строк и ошибка too_many_rows.

У тебя есть такой запрос
SQL
1
2
3
4
SELECT price INTO price_uslug
  FROM uslugi INNER JOIN zakaz_uslugi ON
  uslugi.id_uslugi=zakaz_uslugi.id_uslugi  
  WHERE zakaz_uslugi.id_zakaz=:NEW.id_zakaz;
Я не знаю условий твоей задачи, но предполагаю, что kol_vo_zakaz тоже находится в выбранной строке (если это не так, тогда действительно придется написать еще один запрос).
Если таки находится, то
SQL
1
2
SELECT price, kol_vo_zakaz INTO price_uslug
, v_kol_zakaz    -- понятно, что эту переменную надо предварительно описать
0
0 / 0 / 0
Регистрация: 24.11.2014
Сообщений: 47
08.05.2015, 11:19  [ТС] 11
поэтому я и выложил картинку с частью бд, для которой нужно написать триггер, и написал где и что находиться и что в итоге должно получится
0
Модератор
4217 / 3058 / 583
Регистрация: 21.01.2011
Сообщений: 13,205
08.05.2015, 11:42 12
Цитата Сообщение от XAKEP Посмотреть сообщение
поэтому я и выложил картинку с частью бд
Я, честно говоря, не знаю, чем может помочь эта картинка. Обычно приводят DDL таблиц, а возможно и тестовые данные. А что касаемо того, находится ли kol_vo_zakaz в выбранной строке или нет, то это гораздо быстрее тебе просто посмотреть с пом. запроса, чем выяснять на форуме, где под рукой нет твоей БД.
0
0 / 0 / 0
Регистрация: 24.11.2014
Сообщений: 47
08.05.2015, 11:48  [ТС] 13
все три значения сумма товара, сумма услуги и количество услуг находятся все трёх разных таблицах.
с суммой товара все просто мы ее вытаскиваем из таблицы товар и не паримся, а вот чтобы вытащить сумму услуги*количество услуг, здесь сложнее, вот что мне нужно реализовать.
так как вытаскивая сумму услуги*количество мы узнаем сколько было затрачено денег на выбранную услугу, так как услуг может быть заказано разное количество
0
0 / 0 / 0
Регистрация: 24.11.2014
Сообщений: 47
08.05.2015, 12:31  [ТС] 14
подскажите что значит,если в бд данных после добавления новой записи выводиться в поле черточка, вместо значения, на это поле написан триггер. это при работе с oracle
0
105 / 49 / 26
Регистрация: 01.09.2014
Сообщений: 140
08.05.2015, 12:58 15
Может хотя бы ddl таблиц покажешь, какой инсерт делал, какой тригер, какой результат селекта после добавления строки ?...
0
0 / 0 / 0
Регистрация: 24.11.2014
Сообщений: 47
08.05.2015, 13:04  [ТС] 16
вот триггер
Кликните здесь для просмотра всего текста

create or replace trigger price_common
before insert or update of price_zakaz on zakaz
for each row
declare
price_tovar tovar.price%type;
price_uslug uslugi.price%type;
begin
select price into price_tovar
from tovar
where tovar.id_tovar=:new.id_tovar;

select sum(price*kol_vo_zakaz) into price_uslug
from uslugi inner join zakaz_uslugi on
uslugi.id_uslugi=zakaz_uslugi.id_uslugi

WHERE zakaz_uslugi.id_zakaz=:new.id_zakaz;

:new.price_zakaz:=price_uslug+price_tovar;
end;


таблицы внизу на картинке.

а вот что вывелось после insert тоже на картинке
Миниатюры
Триггер для подсчёта стоимости всего заказа   Триггер для подсчёта стоимости всего заказа  
0
3 / 3 / 1
Регистрация: 04.05.2015
Сообщений: 23
08.05.2015, 13:14 17
если был бы DDL таблиц то написал скрипт, а так в общем цена услуг в заказе
SELECT
sum(z.kol_uslug*(select u1.price from uslugi u1 where u1.id_uslugi=z.id_uslugi))
FROM zakaz_uslugi z
where z.id_zakaz=:id_zakaz;
0
0 / 0 / 0
Регистрация: 24.11.2014
Сообщений: 47
08.05.2015, 13:34  [ТС] 18
вот ddl всех таблиц:
таблица товар
Oracle 11 SQL
1
2
3
4
5
CREATE TABLE tovar
(id_tovarnumber(3) CONSTRAINT pk_tovar PRIMARY KEY,
name_tovar VARCHAR2(150) NOT NULL,
price NUMBER(5) NOT NULL
)
таблица услуги
Oracle 11 SQL
1
2
3
4
5
6
CREATE TABLE uslugi
(
id_uslugi NUMBER(3) CONSTRAINT pk_uslugi PRIMARY KEY,
name_uslugi VARCHAR2(50) NOT NULL,
price NUMBER(5) NOT NULL
)
таблица заказ
Oracle 11 SQL
1
2
3
4
5
6
7
8
9
10
11
12
CREATE TABLE zakaz
(
id_zakaz NUMBER(3) CONSTRAINT pk_zakaz PRIMARY KEY,
date_zakaz DATE NOT NULL,
id_client NUMBER(3) NOT NULL,
id_tovar NUMBER(3) NOT NULL,
price_zakaz NUMBER(5),
id_discont NUMBER(3),
CONSTRAINT fk_id_client foreign KEY(id_client) references client(id_client) ON DELETE CASCADE,
CONSTRAINT fk_tovar foreign KEY(id_tovari) references tovar(id_tovar) ON DELETE CASCADE,
CONSTRAINT fk_discont foreign KEY(id_discont) references discont(id_discont) ON DELETE CASCADE
)
таблица заказ_услуги
Oracle 11 SQL
1
2
3
4
5
6
7
8
9
10
CREATE TABLE zakaz_uslugi
(
id_zakaz NUMBER(3) NOT NULL,
id_uslugi NUMBER(3) NOT NULL,
kol_vo_zakaz NUMBER(3) NOT NULL,
price_uslugi NUMBER(5),
CONSTRAINT pk_zakaz_uslugi PRIMARY KEY(id_zakaz,id_uslugi),
CONSTRAINT fk_id_zakaz foreign KEY(id_zakaz) references zakaz(id_zakaz) ON DELETE CASCADE,
CONSTRAINT fk_id_uslugi foreign KEY(id_uslugi) references uslugi(id_uslugi) ON DELETE CASCADE
)
0
3 / 3 / 1
Регистрация: 04.05.2015
Сообщений: 23
08.05.2015, 13:41 19
для чего price_uslugi в zakaz_uslugi если в uslugi есть price?
0
0 / 0 / 0
Регистрация: 24.11.2014
Сообщений: 47
08.05.2015, 13:57  [ТС] 20
это поле, которое предназначалось для другого но щас оно не нужно, забыл удалить
0
08.05.2015, 13:57
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.05.2015, 13:57
Помогаю со студенческими работами здесь

Поле для подсчета стоимости заказа с учетом цены, скидки и комиссии
База данных "Отели", Форма «Стоимость» на основе запроса выборки. На форме создать поле для...

Создать триггер для занесения стоимости каждого проданного билета во временную таблицу
Если кто-нибyдь может, то помогите пожалyйста. Все задания сделал, кроме этого, просто с триггерами...

Калькулятор подсчёта стоимости игры
Подскажите пожалуйста код калькулятора который подсчитывает стоимость одного слота игры + период...

Калькулятор подсчёта стоимости продуктов.
Здравствуйте!) Помогите, пожалуйста, составить небольшую программу-калькулятор для подсчёта...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru