Oracle: товарный запас против количественного триггера - PullRequest
0 голосов
/ 10 декабря 2011

Надеюсь, это последний из многих вопросов о триггерах!Все еще работает с той же базой данных, где сущность Order_line является связующим звеном между Order и Products.С помощью этого триггера я просто хочу проверить, больше ли текущий объем заказа, чем запас в продуктах.В настоящий момент я буду делать это, используя две переменные, Ordered (количество) и Total (запас) и сравнивая их, но это не работает.Если количество превышает запас, вставляемая запись должна быть удалена, и возникает ошибка.

CREATE OR REPLACE TRIGGER Checks_Order
BEFORE INSERT ON order_line
FOR EACH ROW 
DECLARE 
ordered int; 
total INT; 

BEGIN
SELECT ol.quantity INTO ordered FROM order_line ol WHERE 
ol.product_no = :new.product_no; 

if(ordered>0) then
SELECT p.stock INTO total FROM
products p WHERE p.product_no = :new.product_no; 
  IF (ordered < total) then 
DELETE FROM order_line ol where ol.order_no = :new.order_no; 
  RAISE_APPLICATION_ERROR(-20103, 'Not enough stock!');
END IF;
 END IF;

END;
. 
run

Помогите, пожалуйста?

1 Ответ

2 голосов
/ 10 декабря 2011

Триггер не будет работать, потому что вы не можете выбрать или даже удалить из таблицы, к которой принадлежит триггер.

Но на самом деле вам не нужно, упорядоченное значение можно получить через: new.quantity.

И если вы выдадите ошибку, INSERT не произойдет, нет необходимостина DELETE строку.

Итак - если я правильно понял ваше намерение - следующее должно делать то, что вы хотите:

CREATE OR REPLACE TRIGGER Checks_Order
BEFORE INSERT ON order_line
FOR EACH ROW 
DECLARE 
  total INT; 
BEGIN
  if (:new.quantity > 0) then
    SELECT p.stock 
       INTO total 
    FROM products p 
    WHERE p.product_no = :new.product_no; 

    IF (:new.quantity > total) then 
      RAISE_APPLICATION_ERROR(-20103, 'Not enough stock!');
    END IF;
  END IF;

END;
/ 

Кстати: я думаю, вы хотите :new.quantity > total не <всего </strong>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...