PL / SQL Вставить чек - PullRequest
0 голосов
/ 13 апреля 2020

Просто проблема с обеспечением ограничения не нарушается.

Цель: вставить запись, которая не нарушает ограничение.

Ограничение: ордер не должен быть разрешен, если он больше не выпускается или отсутствует на складе.

Теперь у меня есть процедура, над которой я работал, и работает необходимый синтаксис. Просто нужны последние штрихи, чтобы эта процедура вставки работала.

/* Creating Procedure */
CREATE PROCEDURE INSERT_ORDER_DETAIL(
--PARAMETERS
    p_product_name IN VARCHAR,
    p_unit_price IN NUMBER,
    p_quantity IN NUMBER,
    p_discount IN NUMBER) IS

--VARIABLES AND DECLARATION FOR PROCEDURE
    p_order_id NUMBER;
    PRODUCT_LIST PRODUCT%ROWTYPE;
    Fail EXCEPTION;

BEGIN
-- Check for product availability
    BEGIN
        SELECT *
        INTO PRODUCT_LIST
        FROM PRODUCT
        WHERE DISCONTINUED = 'N'; -- select all orders available
    EXCEPTION
        WHEN NO_DATA_FOUND THEN
            DBMS_OUTPUT.PUT_LINE('ERROR ! PRODUCT IS UNAVAILABLE');
            RAISE Fail;
    END;

--generate new order ID    
    SELECT MAX(ORDER_ID)+1
    INTO p_order_id
    FROM ORDER_DETAIL;

-- INSERTING A NEW ORDER
    INSERT INTO ORDER_DETAIL VALUES (p_order_id, p_product_name, p_unit_price, p_quantity, p_discount);
    COMMIT;
    DBMS_OUTPUT.PUT_LINE('DONE!');
EXCEPTION
    WHEN Fail THEN
        ROLLBACK;
    WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE(SQLERRM);
        ROLLBACK;
END INSERT_ORDER_DETAIL;
/

1 Ответ

1 голос
/ 13 апреля 2020

У вас есть два простых подхода, реализуйте любой из них.

  1. В вашей процедуре вставки добавьте условие IF, чтобы проверить, доступен ли продукт в инвентаре для входного заказа, и поместите оператор INSERT внутри блока IF. Иначе, поднять EXCEPTION продукт недоступен. Аналогичным образом проверьте и количество.

Или

  1. Создайте FUNCTION на основе вышеуказанной логики c, которая возвращает TRUE, если продукт существует. Вы можете просто go для счетчика в таблице для соответствующего продукта в функции.
  2. На основе возвращаемого значения функции TRUE, вызвать процедуру INSERT. В противном случае, если FALSE, создайте исключение, что продукт недоступен.

Поместите все функции, процедуры в один пакет.

...