Моя корзина покупок с курсором выдает ошибки - PullRequest
1 голос
/ 01 мая 2019

У меня есть групповой проект, в котором мы создаем приложение для корзины покупок. Я получил некоторую обратную связь и исправил ее, превратив в процедуру с курсором. Тем не менее, мы все еще получаем ошибки, которые я не знаю, как исправить, такие как попытка поместить нулевое значение в столбец таблицы, который не может быть нулевым. Я не знаю, почему он думает, что я пытаюсь ввести нулевое значение. Наш проект уже завтра, поэтому, пожалуйста, помогите!

Сначала я попробовал использовать его как триггер, но он не работал, поэтому мне предложили превратить его в процедуру с курсором.

create or replace PROCEDURE CANCELCART (arg_cart_id IN number)

IS
ws_prod_id number;
ws_item_quantity_in_cart number;
ws_cart_id number;
ws_cart_status char;

cursor cancel IS
select item_product_id, item_quantity_in_cart
FROM sc_items i
WHERE item_cart_id = arg_cart_id
group by item_product_id;

alreadycancelled exception;

BEGIN
select max(cart_id) into ws_cart_id
from sc_cart
where arg_cart_id = cart_id;

/*cart check*/
select max(cart_status) into ws_cart_status
from sc_cart
where arg_cart_id = cart_id;

if ws_cart_id is null
    then raise alreadycancelled;
    end if;

open cancel;
LOOP
fetch cancel into ws_prod_id, ws_item_quantity_in_cart;
    UPDATE sc_product p SET prod_quan_avail = prod_quan_avail + ws_quantity_in_cart, 
    prod_quan_sold = prod_quan_sold - ws_quantity_in_cart
    WHERE prod_id = ws_prod_id;
    DELETE FROM sc_items i WHERE i.item_cart_id = arg_cart_id;
END LOOP;
close cancel;

DELETE FROM sc_cart c WHERE c.cart_id = arg_cart_id;

EXCEPTION
when alreadycancelled 
    then raise_application_error(-20400, 'Cart does not exist');

END;

Мне нужен этот код для отмены корзины покупок и возврата всех количеств товара обратно на исходный запас.

1 Ответ

1 голос
/ 01 мая 2019

В вашем кодовом блоке практически отсутствует пропущенная часть, кроме определения переменной ws_quantity_in_cart с типом данных и добавления дополнительной обработки для других типов исключений, чем те, которые уже включены (ORA-20400)

CREATE OR REPLACE PROCEDURE CANCELCART( arg_cart_id sc_cart.cart_id%type ) IS
    ws_prod_id               sc_product.prod_id%type;
    ws_item_quantity_in_cart sc_product.prod_quan_avail%type;
    ws_cart_id               sc_cart.cart_id%type;
    ws_cart_status           sc_cart.cart_status%type;
    ws_quantity_in_cart      sc_product.prod_quan_sold%type;

    cursor cancel IS
    select item_product_id, item_quantity_in_cart
      from sc_items i
     where item_cart_id = arg_cart_id
     group by item_product_id;

    alreadycancelled exception;

BEGIN
    select max(cart_id)
      into ws_cart_id
      from sc_cart
     where arg_cart_id = cart_id;

    /*cart check*/
    select max(cart_status)
      into ws_cart_status
      from sc_cart
     where arg_cart_id = cart_id;

    if ws_cart_id is null
        then raise alreadycancelled;
        end if;

    open cancel;
    loop
    fetch cancel into ws_prod_id, ws_item_quantity_in_cart;
        update sc_product p 
           set prod_quan_avail = prod_quan_avail + ws_quantity_in_cart,
               prod_quan_sold = prod_quan_sold - ws_quantity_in_cart
         where prod_id = ws_prod_id;
        delete sc_items i where i.item_cart_id = arg_cart_id;
    end loop;
    close cancel;

    delete sc_cart c where c.cart_id = arg_cart_id;

 exception when alreadycancelled  then raise_application_error(-20400, 'Cart does not exist');
           when      others       then raise_application_error(SQLCODE,SQLERRM);

END;

Предпочитайте использовать исходные типы данных столбца <table_name>.<column_name>.%type для определения типов данных переменных и никогда не используйте строковую переменную фиксированной длины типа char, вместо этого используйте varchar2.

...