2015-10-22 4 views
0

У меня есть таблица с именем M_InventoryLineСоздание триггера из другой таблицы

 M_InventoryLine 
M_Product_ID || QtyEntered 
101   || 50 

     M_Replenish 
M_Product_ID || Level_Min 
101   || 20 


VW_DaftarBarang_Available 
M_Product_ID || Available 
101   || 35 

QtyEntered не может быть больше, чем Available + Level_Min так, мне нужно Raise Application Error в триггере.

Я попытался сделать триггер, как это:

CREATE OR REPLACE TRIGGER SAVE_ERROR 
BEFORE INSERT OR UPDATE ON M_INVENTORYLINE 
FOR EACH ROW 
DECLARE 
    AVAILABLE_ST NUMBER; 
    MIN_LEVEL NUMBER; 
BEGIN 

    SELECT AVAILABLE INTO AVAILABLE_ST 
    FROM vw_daftarbarang_available 
    where m_product_id = :new.m_product_id; 

    SELECT LEVEL_MIN INTO MIN_LEVEL 
    FROM M_REPLENISH 
    WHERE M_PRODUCT_ID = :NEW.M_PRODUCT_ID; 

    IF :NEW.QTYENTERED > :OLD.AVAILABLE + :OLD.MIN_LEVEL THEN 
    RAISE_APPLICATION_ERROR(-20000,'QUANTITY IS NOT ENOUGH'); 
    END IF; 
END; 

Но это не работает. Любое предложение сделать триггер успешным?

+0

Есть ли у вас какие-либо ошибки? Вы вставляете отладочную печать, чтобы посмотреть, какая статута выполняется? –

+0

Я запустил его через SQLPlus, и он говорит, что таблица или представление не существует .. но я уже сделал все таблицы и представления. Что вы подразумеваете под вставкой отладочной печати? Я сожалею, что я новичок ... –

ответ

0

Edit вы вызываете к этому:

CREATE OR REPLACE TRIGGER SAVE_ERROR 
    BEFORE INSERT OR UPDATE ON M_INVENTORYLINE 
    FOR EACH ROW 
    DECLARE 
     AVAILABLE_ST NUMBER; 
     MIN_LEVEL NUMBER; 
    BEGIN 

    SELECT AVAILABLE INTO AVAILABLE_ST FROM vw_daftarbarang_available 
    where m_product_id = :new.m_product_id; 

    SELECT LEVEL_MIN INTO MIN_LEVEL FROM M_REPLENISH 
    WHERE M_PRODUCT_ID = :NEW.M_PRODUCT_ID; 

    IF :NEW.QTYENTERED > AVAILABLE_ST + MIN_LEVEL 
    THEN RAISE_APPLICATION_ERROR(-20000,'QUANTITY IS NOT ENOUGH'); 
    END IF; 
    END; 
+0

Спасибо @Vance, что триггер успешно создан. Но когда я выполняю, он говорит об ошибке следующим образом: «ORA-01422: точная выборка возвращает больше, чем запрашивалось количество строк». Как я могу найти причину ошибки и решить ее? –

+0

Это означает, что имеется несколько AVAILABLE или LEVEL_MIN, извлеченных из таблиц vw_daftarbarang_available/M_REPLENISH, имеющих новый M_PRODUCT_ID, который вставлен. Есть ли случай в ваших таблицах, где AVAILABLE и LEVEL_MIN могут существовать более одного раза? – Vance

+0

ах, я вижу. 'M_Product_ID' должен быть выбран на основе' M_Warehouse_ID' как в 'M_Replenish', так и' VW_DaftarBarang_Available', так что у него есть одна запись. Мой триггер, расположенный в 'M_InventoryLine', тем временем' M_Warehouse_ID' расположен в 'M_Inventory'. 'M_Inventory' и' M_InventoryLine' связаны 'M_Inventory_ID' –

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