DB 0710

yunha·2023년 7월 10일
0

DB

목록 보기
26/26

트리거

--입고 테이블에 상품이 입력되면 입고 수량을 상품 테이블의 재고 수량에 추가하는 트리거 작성
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';
profile
기록

0개의 댓글