#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 — это идентификатор клиента