CREATE OR REPLACE TRIGGER trg_purchasing_to_inventory
AFTER INSERT ON PURCHASING
FOR EACH ROW
DECLARE
v_count NUMBER;
BEGIN
-- INVENTORIES 테이블에서 해당 BARCODE가 존재하는지 확인
SELECT COUNT(*)
INTO v_count
FROM INVENTORIES
WHERE BARCODE = :NEW.BARCODE;
IF v_count > 0 THEN
-- 이미 존재하면 INVENTORY 수량 증가
UPDATE INVENTORIES
SET INVENTORY = INVENTORY + :NEW.QUANTITY
WHERE BARCODE = :NEW.BARCODE;
ELSE
-- 존재하지 않으면 새 레코드 삽입
INSERT INTO INVENTORIES (BARCODE, INVENTORY)
VALUES (:NEW.BARCODE, :NEW.QUANTITY);
END IF;
END;
/
CREATE OR REPLACE PROCEDURE update_inventory(p_barcode IN VARCHAR2, p_quantity IN NUMBER)
IS
v_count NUMBER;
BEGIN
-- INVENTORIES에서 BARCODE 확인
SELECT COUNT(*)
INTO v_count
FROM INVENTORIES
WHERE BARCODE = p_barcode;
IF v_count > 0 THEN
-- 존재하면 재고 증가
UPDATE INVENTORIES
SET INVENTORY = INVENTORY + p_quantity
WHERE BARCODE = p_barcode;
ELSE
-- 없으면 새로 추가
INSERT INTO INVENTORIES (BARCODE, INVENTORY)
VALUES (p_barcode, p_quantity);
END IF;
COMMIT;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
RAISE_APPLICATION_ERROR(-20001, 'Inventory update failed: ' || SQLERRM);
END update_inventory;
/
CREATE INDEX idx_inventories_barcode ON INVENTORIES(BARCODE);
-- PURCHASING 테이블에 데이터 삽입
INSERT INTO PURCHASING (BARCODE, QUANTITY) VALUES ('12345', 10);
-- INVENTORIES 확인
SELECT * FROM INVENTORIES WHERE BARCODE = '12345';
-- 결과: BARCODE = '12345', INVENTORY = 10
-- 동일 품목 추가 구매
INSERT INTO PURCHASING (BARCODE, QUANTITY) VALUES ('12345', 5);
-- INVENTORIES 확인
SELECT * FROM INVENTORIES WHERE BARCODE = '12345';
-- 결과: BARCODE = '12345', INVENTORY = 15