Мой триггер PLSQL не проходит через таблицу - PullRequest
0 голосов
/ 30 апреля 2019

У меня есть групповой проект, и мы используем PLSQL для создания приложения для корзины покупок. Мы создаем триггер, чтобы отменить корзину и вернуть все товары обратно на склад. Как и сейчас, если вы добавляете несколько товаров в корзину, при запуске триггера он добавляет только запас одного продукта, а не все, поэтому по какой-то причине триггер не проходит по циклу. Наш проект уже завтра, поэтому, пожалуйста, помогите!

create or replace TRIGGER Cancel
Before delete on sc_cart
For each row

DECLARE
ws_prod_id number(3,0);
ws_item_quantity_in_cart number(7,0);

BEGIN

/*product and quantity in cart*/
select max(item_product_id), max(item_quantity_in_cart) into ws_prod_id, ws_item_quantity_in_cart
from sc_items
where item_cart_id = :old.cart_id;

update sc_product set prod_quan_avail = prod_quan_avail + ws_item_quantity_in_cart where ws_prod_id = prod_id;
update sc_product set prod_quan_sold = prod_quan_sold - ws_item_quantity_in_cart where ws_prod_id = prod_id;

delete from sc_items
where :old.cart_id = item_cart_id;

END;

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

Ответы [ 2 ]

2 голосов
/ 30 апреля 2019

Когда вы делаете это:

   SELECT MAX (item_product_id), MAX (item_quantity_in_cart)
     INTO ws_prod_id, ws_item_quantity_in_cart
     FROM sc_items i
    WHERE i.item_cart_id = cancel_card.cart_id_in;

Вы просто выбираете ОДИН (1) product => max (item_product_id)

Таким образом, это единственный обновленный продукт, и чтобы сделать вещихуже того, со временем он будет обновляться с помощью max (qty) из другого продукта ...

Вам нужен курсор продуктов корзины и для каждого продукта выполните необходимые обновления.

Триггеры неплохо или хорошо, но, как правило, я полностью согласен с комментарием Стивена Фюрштайна, вы должны избегать их.Но иногда вы не можете.

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

2 голосов
/ 30 апреля 2019

Я призываю вас не помещать весь этот код в триггер, а вместо этого создать процедуру cancel_order, например:

CREATE OR REPLACE PROCEDURE cancel_card (cart_id_in IN INTEGER)
IS
   ws_prod_id                 NUMBER (3, 0);
   ws_item_quantity_in_cart   NUMBER (7, 0);
BEGIN
   /*product and quantity in cart*/
   SELECT MAX (item_product_id), MAX (item_quantity_in_cart)
     INTO ws_prod_id, ws_item_quantity_in_cart
     FROM sc_items i
    WHERE i.item_cart_id = cancel_card.cart_id_in;

   UPDATE sc_product p
      SET prod_quan_avail = prod_quan_avail + ws_item_quantity_in_cart,
          prod_quan_sold = prod_quan_sold - ws_item_quantity_in_cart
    WHERE p.prod_id = cancel_card.ws_prod_id;

   DELETE FROM sc_items o
         WHERE i.cart_id = cancel_card.cart_id_in;

   DELETE FROM sc_cart c
         WHERE c.cart_id = cancel_card.cart_id_in;
END;

Затем вы вызываете эту процедуру по мере необходимости, но не из триггера.

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

...