Я заранее прошу прощения за этот запутанный вопрос, стену текста и ужасный триггер.Я разрабатываю небольшую базу данных для розничного магазина, которая принимает заказы в магазине, а затем доставляет продукты со склада / склада на месте.
Теперь объект заказа имеет отношение один-ко-многим к order_lineсубъект, который, в свою очередь, имеет отношение один к одному с продуктом (который сам хранится на складе и т. д.).Сущность order_line является сущностью связи и решает отношение «многие ко многим», так что это все хорошо.Просто чтобы уточнить, это одна строка заказа на продукт.
Что я хочу сделать, это когда создается строка заказа (которая имеет количественный атрибут), я хочу, чтобы триггер сначала проверил, что соответствующий продукт имеет достаточный запас (поэтомуесли количество равно 3, запас должен быть не менее 3), в противном случае он должен выдать ошибку.
В случае успеха я хочу соответствующим образом обновить атрибуты количества и запаса.Я также хотел бы добавить промежуточную сумму к order_line (я еще не пытался это сделать), которая, в свою очередь, может затем использоваться для вычисления общего значения в сущности order.
Итак, на этом этапеЯ ищу немного руководства, потому что сейчас я очень смущен этим.
CREATE OR REPLACE TRIGGER check_order_line
BEFORE INSERT OR UPDATE ON order_line
for each row
BEGIN
select order_line.quantity, products.stock from order_lines right join products on order_line.product_no=products.product_no;
if(order_line.quantity>products.stock) then
RAISE_APPLICATION_ERROR(-20103, 'Insufficient Stock');
ELSE
products.stock := products.stock - quantity;
dbms_output.put('Successful');
END IF;
END;
.
run
Ошибки, которые я получаю:
2/1 PL/SQL: SQL Statement ignored
2/49 PL/SQL: ORA-00942: table or view does not exist
3/1 PL/SQL: Statement ignored
3/15 PLS-00357: Table,View Or Sequence reference 'ORDER_LINE.QUANTITY'
not allowed in this context
Что я пробовал:
- Я не уверен насчет первых двух ошибок;рассматриваемая таблица определенно называется order_line, возможно, я пропустил что-то очевидное.
- Я также попытался объявить переменные для products.stock и order_line кол-ва, чтобы решить последнюю ошибку - это компилирует IIRC, но на самом деле не работает, так как, я думаю, это не обновляет таблицу.
- Меня не очень беспокоит действие else, возможно, мне нужен там оператор обновления таблицы, но сейчас я просто сосредоточен на том, чтобы заставить работать условие триггера.
Если кто-нибудь может указать мне правильное направление и указать на любые смешные ошибки, я буду признателен за это.
Большое спасибо за ваше время, я прошу прощения за шрамглаза с этим чудовищным триггером.