Создать триггер обновления Oracle

Привет, ребята, впервые спрашиваю здесь, в Stack Overflow.

Итак, мой вопрос заключается в следующем: когда строка вставляется в таблицу A, необходимо рассчитать призовые баллы и добавить их в столбец заработанных баллов в таблице B. Нам также необходимо рассчитать дополнительные баллы в зависимости от уровня клиентов в таблице B. Таблица B. В таблице B есть FK, который ссылается на таблицу C, содержащую атрибут, который мне нужен, чтобы мой расчет заработанных баллов был правильным.

Мне удалось скомпилировать следующий код, который в основном связывает таблицы A и B, но я не знаю, как получить нужное мне значение из таблицы C, чтобы это было правильно.

CREATE OR REPLACE TRIGGER JavierRewards
AFTER INSERT ON Purchases
FOR EACH ROW
BEGIN
    UPDATE customers
    SET customers.earned_points = customers.earned_points + Round(:New.purchase_amount * 1.5)
    WHERE customers.cust_id = :new.cust_id;
END;

Любые идеи? Первый раз обучение срабатывает, поэтому это немного расстраивает.


person Javier Ruiz Velez    schedule 01.12.2018    source источник
comment
Общее замечание: не делайте слишком много этой логики в триггерах. В конце концов вам может понадобиться внести изменения без срабатывания этих триггеров, и вы в основном застряли с большим количеством бизнес-логики, скрытой в вашей базе данных, без какой-либо возможности контролировать, когда она срабатывает. Если вы не можете взять его из базы данных, по крайней мере, создайте хранимую процедуру, которая хранит покупку и обновляет клиента. Я узнал это на собственном горьком опыте.   -  person GolezTrol    schedule 02.12.2018
comment
Это домашнее задание, а после этого мне нужно сделать процедуры, лол   -  person Javier Ruiz Velez    schedule 02.12.2018
comment
Ах ^.^ В таком случае все в порядке :)   -  person GolezTrol    schedule 02.12.2018
comment
Любые предложения для этого в то же время?   -  person Javier Ruiz Velez    schedule 02.12.2018
comment
О, я думал, что Барбарос Ожан уже готов ответить на ваш вопрос. :-) И вы можете немного поддержать его, прочитав это.   -  person GolezTrol    schedule 02.12.2018


Ответы (2)


Вы можете использовать следующий с дополнительным оператором выбора:

CREATE OR REPLACE TRIGGER JavierRewards
AFTER INSERT ON Purchases
FOR EACH ROW
    v_Extra_Amount TableC.Extra_Amount%type;
BEGIN
   BEGIN
      SELECT c.Extra_Amount 
        INTO v_Extra_Amount
        FROM TableC c 
        JOIN customers s on s.c_ID = c.ID
       WHERE s.cust_id = :new.cust_id;
     EXCEPTION WHEN no_data_found THEN v_Extra_Amount := 0;
   END;

    UPDATE customers s
       SET s.earned_points = s.earned_points + Round(:New.purchase_amount * 1.5) 
                            + (:New.Purchase_amount * v_Extra_Amount)
     WHERE s.cust_id = :new.cust_id;
END;
person Barbaros Özhan    schedule 01.12.2018
comment
Привет Барбарос! В таблице C есть число, которое я хочу использовать в своих расчетах, но я не знаю, как его получить. Мне нужен способ получить c.earned points = c.earned_points + Round(:New.purchase_amount * 1.5) + (:New.Purchase_amount * Extra Amount). Дополнительная сумма — это значение, содержащееся в таблице C. - person Javier Ruiz Velez; 02.12.2018
comment
@JavierRuizVelez Привет, Хавьер, я обновил, это ты ищешь ..? - person Barbaros Özhan; 02.12.2018
comment
Привет, Барбарос, просто чтобы внести ясность, так как я чувствую, что я повсюду пытаюсь объяснить это: в таблице B есть FK с именем Tier_ID, который ссылается на Rewards_Tier (таблица C). В таблице C есть атрибут Extra_Amount, который я не знаю, как получить. Почему-то то, что вы мне написали, выдало мне ошибку. - person Javier Ruiz Velez; 02.12.2018
comment
Барбарос большое спасибо, что вы решили более 12 часов боли. Большое спасибо, сэр. - person Javier Ruiz Velez; 02.12.2018
comment
@JavierRuizVelez Добро пожаловать, дорогой друг. Пожалуйста, отметьте ответ, если он вам помог. - person Barbaros Özhan; 02.12.2018
comment
Эй, Барбарос! У меня вопрос относительно процедуры, которую я пытаюсь написать. Вы можете помочь мне с этим? - person Javier Ruiz Velez; 08.12.2018
comment
@JavierRuizVelez Привет, Хавьер, скажи мне, пожалуйста. - person Barbaros Özhan; 09.12.2018

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

person Beck Rakhimov    schedule 02.12.2018