트리거 실행시 새로 입력한 값, 이전 값에 대해 출력할 수 있음
INSERT -> 새로운 값(0), 이전 값(X)
UPDATE -> 새로운 값(0), 이전값(O)
DELETE -> 새로운 값(X), 이전값(O)
새로운값 -> :NEW.컬럼명
이전값 -> :OLD.컬럼명
// 신입 사원이 추가되면 신입사원이 입사하였습니다 출력하는 트리거
CREATE OR REPLACE TRIGGER TRG_01
AFTER INSERT ON EMPLOYEE // 삽입된 후에 출력
FOR EACH ROW
BEGIN
DBMS_OUTPUT.PUT_LINE('신입사원 '||:NEW.EMP_NAME||'님이 입사하였습니다');
END;
/
INSERT INTO EMPLOYEE VALUES('899','최영영영','970105-1234567','CHOI@CHOIK.COM','01012341234','D3','J1',
'S1',10,0.5,200,SYSDATE,NULL,DEFAULT);
// 트리거로 재고 관리하기
create table tbl_product(
pcode NUMBER PRIMARY KEY,
PNAME VARCHAR2(20) NOT NULL,
BRAND VARCHAR2(20),
PRICE NUMBER CHECK(PRICE > 0),
STOCK NUMBER DEFAULT 0
);
CREATE SEQUENCE SEQ_PRO;
CREATE TABLE TBL_PROIO(
IOCODE NUMBER PRIMARY KEY,
PCODE NUMBER REFERENCES TBL_PRODUCT(PCODE),
IODATE DATE,
AMOUNT NUMBER CHECK(AMOUNT >0),
STATUS VARCHAR2(10) CHECK(STATUS IN('입고','출고'))
);
CREATE SEQUENCE SEQ_PROIO;
SELECT * FROM tbl_product;
SELECT * FROM TBL_PROIO;
INSERT INTO tbl_product VALUES(SEQ_PRO.NEXTVAL,'랜드로버','랜드로버',80000000,DEFAULT);
INSERT INTO tbl_product VALUES(SEQ_PRO.NEXTVAL,'맥북프로','애플',2800000,DEFAULT);
INSERT INTO tbl_product VALUES(SEQ_PRO.NEXTVAL,'에어컨','삼성',1300000,DEFAULT);
INSERT INTO tbl_product VALUES(SEQ_PRO.NEXTVAL,'아이패드','애플',1600000,DEFAULT);
SELECT * FROM tbl_product;
INSERT INTO TBL_PROIO VALUES(SEQ_PROIO.NEXTVAL,1,SYSDATE,10,'입고');
INSERT INTO TBL_PROIO VALUES(SEQ_PROIO.NEXTVAL,2,SYSDATE,7,'입고');
INSERT INTO TBL_PROIO VALUES(SEQ_PROIO.NEXTVAL,2,SYSDATE,3,'출고');
SELECT * FROM TBL_PROIO;
DELETE FROM TBL_PROIO;
COMMIT;
CREATE OR REPLACE TRIGGER TRG_PRODUCT // 트리거를 통해서 STOCK 컬럼을 수정하게 하는 작업 (수량 수정)
AFTER INSERT ON TBL_PROIO // 트리거는 커밋을 자동으로 해줌 (굳이 넣을필요없음)
FOR EACH ROW
BEGIN
IF :NEW.STATUS='입고' // 값이 삽입과정이 끝난 후 각 STATUS 컬럼이 어떤거냐에 따라서 STOCK 컬럼이 변경됨
THEN UPDATE TBL_PRODUCT SET STOCK = STOCK +: NEW.AMOUNT WHERE :NEW.PCODE = PCODE;
ELSIF :NEW.STATUS='출고'
THEN UPDATE TBL_PRODUCT SET STOCK = STOCK -: NEW.AMOUNT WHERE :NEW.PCODE = PCODE;
END IF;
END;