트리거
--입고 테이블에 상품이 입력되면 입고 수량을 상품 테이블의 재고 수량에 추가하는 트리거 작성
CREATE OR REPLACE TRIGGER TRG_04
AFTER INSERT
ON IPGO
FOR EACH ROW
BEGIN
UPDATE PRODUCT
SET prod_jaego = PROD_JAEGO + :NEW.IPGO_QTY
WHERE PROD_ID = :NEW.PROD_ID;
END;
/
--트리거를 실행시킨 후 입고 테이블에 행을 추가
INSERT INTO IPGO(IPGO_ID, PROD_ID, IPGO_QTY, IPGO_COST, IPGO_AMOUNT)
VALUES(4, 'A00002', 20, 1500, 3000);
--입고 테이블에는 물론 상품 테이블의 재고 수량이 변경됨을 확인
SELECT * FROM IPGO;
SELECT * FROM PRODUCT;
--입고 테이블에 상품이 입력되면 자동으로 상품 테이블의 재고 수량이 증가
--입고 테이블에 또 다른 상품을 입력
INSERT INTO IPGO(IPGO_ID, PROD_ID, IPGO_QTY, IPGO_COST, IPGO_AMOUNT)
VALUES(2, 'A00002', 10, 680, 6800);
SELECT * FROM IPGO;
SELECT * FROM PRODUCT;
갱신 트리거
--이미 입고된 상품에 대해서 입고 수량이 변경되면 상품 테이블의 재고수량 역시 변경되어야 함
--이를 위한 갱신 트리거
CREATE OR REPLACE TRIGGER TRG03
AFTER UPDATE ON IPGO
FOR EACH ROW
BEGIN
UPDATE PRODUCT
SET prod_jaego = prod_jaego + (-:old.IPGO_QTY + :NEW.IPGO_QTY)
WHERE PROD_ID = :NEW.PROD_ID;
END;
/
--입고 번호 3번은 냉장고가 입고된 정보를 기록한 것으로서 입고 번호 3번의 입고수량을 10으로 변경
-- => 냉장고의 재고 수량 역시 15로 변경
UPDATE IPGO SET ipgo_qty = 10, IPGO_AMOUNT = 2200
WHERE ipgo_id = 3;
SELECT * FROM IPGO ORDER BY ipgo_id;
SELECT * FROM PRODUCT;
삭제 트리거
--입고 테이블에서 입고되었던 상황이 삭제되면 상품 테이블에 재고수량에서 삭제된 입고수량 만큼을 빼는 삭제 트리거
CREATE OR REPLACE TRIGGER TRG04
AFTER DELETE ON IPGO
FOR EACH ROW
BEGIN
UPDATE PRODUCT
SET prod_jaego = PROD_JAEGO - :old.IPGO_QTY
WHERE prod_id = :old.PROD_ID;
END;
/
--입고 번호 3번은 냉장고가 입고된 정보를 기록한 것으로서 입고 번호가 3번인 행을 삭제
-- =>냉장고의 재고 수량 역시 5로 변경
DELETE IPGO WHERE ipgo_id = 3;
SELECT * FROM IPGO ORDER BY ipgo_id;
SELECT * FROM PRODUCT;
--분류테이블에 추가되거나, 변경될 때 분류코드를 항상 대문자로 처리하는 트리거 예제
CREATE OR REPLACE TRIGGER tg_lprod_upper
BEFORE INSERT OR UPDATE
ON lprod
FOR EACH ROW
BEGIN
:NEW.lprod_gu := UPPER(:NEW.lprod_gu);
END;
/
SELECT * FROM lprod;
CREATE SEQUENCE LPROD_SEQ
INCREMENT BY 1 START WITH 100;
INSERT INTO lprod
VALUES(LPROD_SEQ.NEXTVAL, 'tt07', '트리거 테스트');
--장바구니 테이블에 입력이 발생할 때 재고 수불 테이블에 출고, 현재고를 변경하는 트리거 예제
CREATE OR REPLACE TRIGGER tg_cart_qty_change
AFTER insert or update or delete ON cart
FOR EACH ROW
DECLARE
v_qty NUMBER;
v_prod VARCHAR2(20);
BEGIN
IF INSERTING THEN
v_qty := NVL(:NEW.cart_qty, 0);
v_prod := :NEW.cart_prod;
ELSIF UPDATING THEN
v_qty := NVL(:NEW.cart_qty, 0) - NVL(:OLD.cart_qty, 0);
v_prod := :NEW.cart_prod;
ELSIF DELETING THEN
v_qty := -(NVL(:OLD.cart_qty, 0));
v_prod := :OLD.cart_prod;
END IF;
--장바구니 테이블에 입력이 발생할 때 재고 수불 테이블에 출고, 현재고를 변경하는 트리거 예제
UPDATE remain SET remain_0 = remain_0 + v_qty,
remain_j_99 = remain_j_99 - v_qty
WHERE remain_year = '2003' AND remain_prod = v_prod;
DBMS_OUTPUT.PUT_LINE('수량: ' || v_qty);
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('예외 발생: ' || SQLERRM);
END;
/
SELECT * FROM REMAIN;
INSERT INTO cart VALUES('a001', '2023040100001', 'P101000002', 7);
SELECT * FROM remain
WHERE remain_year = '2003' AND remain_prod = 'P101000002';