오라클 트리거 객체

최주영·2023년 4월 13일
0

오라클

목록 보기
21/22

✅ TRIGGER

  • 테이블이나 뷰가 INSERT, UPDATE, DELETE 등의 DML문에 의해 변경될 경우
    자동으로 실행될 내용을 정의하여 저장하는 객체

트리거 실행시 새로 입력한 값, 이전 값에 대해 출력할 수 있음
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;




profile
우측 상단 햇님모양 클릭하셔서 무조건 야간모드로 봐주세요!!

0개의 댓글