2012-11-19 8 views
0

У меня есть список продуктов в таблице, я хотел создать триггер, который считывает запас в наличии для определенного продукта, а затем, если запас меньше 5, отобразите сообщение. концепция довольно проста.Oracle trigger: условное выражение

Вот что у меня есть.

SET SERVEROUTPUT ON 
SET ECHO ON 

CREATE OR REPLACE TRIGGER TRG_REORDERSTOCK 
AFTER INSERT OR UPDATE OF S_QUANTITY ON STOCK_INVENTORY 
FOR EACH ROW 
BEGIN 
IF :OLD.S_QUANTITY <= 10 THEN 
    DBMS_OUTPUT.PUT_LINE ('Warning: ----- product with ID (' || :OLD.BR_ID || ') has (' || :NEW.S_QUANTITY || ') units remaining, please re-order -----'); 
    ELSE 
     DBMS_OUTPUT.PUT_LINE ('UPDATE COMPLETE'); 
    END IF; 
END; 
/

Теперь, чтобы проверить триггер, я собираюсь обновить количество в руке для определенного продукта;

UPDATE STOCK_INVENTORY 
SET S_QUANTITY = 4 
WHERE BR_ID = 1 
AND P_ID = 6; 

И результат:

Warning: ----- product with ID (1) has (4) units remaining, please re-order ----- 

, что означает, что триггер работает. Однако у Stock_inventory есть несколько продуктов, уровень запасов которых меньше 10, но с условным я имею только сообщение для текущей транзакции.

вот список нескольких продуктов в Stock_inventory, это таблица компоновщиков;

SQL> SELECT * FROM STOCK_INVENTORY;

 BR_ID|  P_ID|S_QUANTITY 
----------|----------|---------- 
     1|   1|  10 
     1|   6|   4 
     1|   3|  30 
     1|   8|  24 
     1|   9|  18 
     2|  10|   9 
     2|   2|  10 
     2|  20|  15 
     2|  16|  17 
     2|  13|  20 
     3|  21|  15 

Как показать список продуктов, количество которых меньше 10? Я довольно новичок в оракуле. Большое спасибо.

Благодаря

ответ

2

Во-первых, почему вы хотите использовать триггер для такого рода вещи? И почему вы хотите, чтобы триггер отображал продукты, которые нужно переупорядочить, кроме тех, которые влияют на текущую транзакцию? Поскольку нет абсолютно никакой гарантии, что кто-либо когда-либо увидит что-либо, написанное в DBMS_OUTPUT, так как кажется, что неразумно предупреждать кого-то, размещающего заказ на продукт 1, чтобы переупорядочить продукт 6, и поскольку вы обычно хотели бы отделить обновление инвентаря от заказа инвентаризации, весь подход не имеет смысла.

Предполагая, что это домашнее задание, однако вы можете использовать триггер оператора уровня вместо

CREATE OR REPLACE TRIGGER trg_new_reorder_stock 
    AFTER INSERT OR UPDATE ON stock_inventory 
BEGIN 
    FOR x IN (SELECT * 
       FROM stock_inventory 
      WHERE s_quantity <= 10) 
    LOOP 
    dbms_output.put_line('Reorder ' || x.p_id || ' it has only ' || x.s_quantity || ' units remaining.'); 
    END LOOP; 
END; 

Поскольку это включает триггер оператора уровня, вы можете запросить stock_inventory таблицы, не заботясь о том, чтобы стол мутирует исключение. Однако это также означает, что вы выполняете потенциально дорогостоящий запрос по всей таблице каждый раз, когда вы вставляете одну строку, которая неэффективна.

+0

Thanks Justin и приятно видеть вас вокруг, вы очень помогли мне в прошлом году, спасибо, что указали эти проблемы, действительно, мне действительно не нужно знать список продуктов менее 10, это можно сделать с помощью простого sql запрос. и да, мне нужно знать только количество доступных для текущей транзакции. –

+0

Что касается триггера, я настолько новичок, что я до сих пор не знаю, когда лучше использовать триггер функцию или процедуру и курсор. вопрос, который мне нужно ответить в моем задании, следующий: «3.3. Определите, когда запас достигнет минимального количества в руке, элемент с низким предложением должен быть повторно заказан сотрудником и должен быть помещен в один из предпочтительных поставщиков магазинов. ' –

+0

Как бы вывести выход dbms на текст? я читал на катушках и процедурах, но довольно запутанным –

Смежные вопросы