본문 바로가기
SQL

SQL 9일차(OLD, NEW 응용)

by teg0 2025. 8. 5.

트리거 응용

트리거 사용할 때 OLD를 사용하지 않았기 때문에 스스로 추가.

 

210번 상품의 수량을 10만큼 증가

UPDATE TB_PRDT
SET STOCK = STOCK + 10
WHERE PCODE = '210';



210번 상품의 수량을 10만큼 감소

UPDATE TB_PRDT
SET STOCK = STOCK - 10
WHERE PCODE = '210';



210번 상품의 STOCK 값이 증가할 경우 또는 값이 감소할 경우,

변경한 값만큼을 TB_PRODETAIL에 반영하고 기록하는 트리거  생성

DROP TRIGGER TRG_03;
CREATE OR REPLACE TRIGGER TRG_03
AFTER UPDATE
ON TB_PRDT
FOR EACH ROW
BEGIN 
    IF :OLD.STOCK < :NEW.STOCK THEN
        INSERT INTO TB_PRODETAIL
        VALUES(SEQ_DECODE.NEXTVAL, 210, SYSDATE, :NEW.STOCK - :OLD.STOCK, 'IN');
    ELSE
        INSERT INTO TB_PRODETAIL
        VALUES(SEQ_DECODE.NEXTVAL, 210, SYSDATE, ABS(:OLD.STOCK - :NEW.STOCK), 'OUT');
    END IF;
END;
/

(ABS는 음수값 방지)

 

하지만 음수값을 방지할 생각이면, ABS보단 예외처리를 하는 것이 더 보기 좋다고 생각하기에...

 

:NEW.STOCK가 0보다 작을 경우의 예외처리를 하려면,

1. 테이블 TB_PRDT의 STOCK의 제약조건에서 CHECK를 이용해 0이상으로 설정한 후 CHECK 제약 조건 위배 설정

EXCEPTION
	WHEN OHTERS 
    	TEHN DBMS_OUTPUT.PUT_LINE('STOCK의 제약 조건에 위배되었습니다. STOCK는 반드시 0보다 커야합니다.');

 

2. ELSIF문으로 조건을 추가하여 :NEW.STOCK가 0보다 작을 경우를 작성.

 

'SQL' 카테고리의 다른 글

SQL 8일차(2)  (0) 2025.08.04
SQL 8일차(1)  (3) 2025.08.04
SQL 7일차(2)  (0) 2025.08.01
SQL 7일차(1)  (3) 2025.08.01
SQL 6일차(3)  (2) 2025.07.31