트리거 응용
트리거 사용할 때 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 |