как мне проверить строку до и после обновления

#sql #database #oracle #plsql

#sql #База данных #Oracle #plsql

Вопрос:

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

Короче говоря, «функция, процедура для проверки количества в наличии перед вставкой строки в таблицу order_line и для обновления также количества в наличии в инвентаре таблицы»

 CREATE OR REPLACE PACKAGE order_package IS
          global_inv_id NUMBER (6);
          global_quantity NUMBER (6);
    PROCEDURE create_new_order(current_c_id NUMBER,
 current_meth_pmt VARCHAR2, current_os_id NUMBER);
   PROCEDURE create_new_order_line(current_o_id NUMBER);
       END;
        /


CREATE OR REPLACE PACKAGE BODY order_package IS

    PROCEDURE create_new_order(current_c_id NUMBER,
 current_meth_pmt VARCHAR2, current_os_id NUMBER) AS
         current_o_id NUMBER;
       BEGIN
         SELECT order_seq.NEXTVAL
         INTO  current_o_id
         FROM   dual;
           INSERT INTO orders
     VALUES(current_o_id, sysdate,current_meth_pmt, current_c_id,
       current_os_id);
          COMMIT;
       create_new_order_line(current_o_id);
       END create_new_order;
   PROCEDURE create_new_order_line(current_o_id NUMBER)AS
       BEGIN
       INSERT INTO order_line
    VALUES(current_o_id,global_inv_id, global_quantity);
         COMMIT;
        END create_new_order_line;
       END;
        /
  

Ответ №1:

Вы не показываете свою инвентарную таблицу, и ваши процедуры, похоже, не имеют значения заказанного количества, так что отчасти это предположение. Что вы, возможно, захотите сделать, так это сначала обновить эту таблицу и использовать RETURNING INTO предложение для получения обновленного инвентаря.

 UPDATE inventory SET global_quantity = global_quantity - order_quantity
 WHERE global_inv_id = current_c_id
RETURNING global_quantity INTO l_global_quantity;

IF l_global_quantity < 0 THEN
    ROLLBACK;
    raise_application_error( -20001, 'You ordered too much!' );
ELSE
    [... create order goes here ...]
END IF;
  

current_c_id Заказывается ли товар? Это вызовет исключение, которое должно быть перехвачено тем, что вызывает вашу процедуру. То, как вы отобразите ошибку пользователю, будет зависеть от используемого прикладного уровня.

Комментарии:

1. Это моя таблица заказов:

2. таблица заказов: СОЗДАЙТЕ ТАБЛИЦУ заказов (НОМЕР o_id (8), ДАТА o_date, o_methpmt VARCHAR2(10), номер c_id(5), НОМЕР os_id(3), и это таблица строк заказов СОЗДАЙТЕ ТАБЛИЦУ order_line (НОМЕР o_id (8), НОМЕР inv_id(10), НОМЕР ol_quantity (4) НЕ NULL, и это таблица инвентаризации СОЗДАТЬ ТАБЛИЦУ инвентаризации (inv_id НОМЕР (10),item_id НОМЕР(8), цвет VARCHAR2(20), inv_size VARCHAR2(10),inv_price НОМЕР (6,2),inv_qoh НОМЕР (4),

3. current_c_id — это идентификатор клиента