영보의 SystemOut.log

[Oracle] PL/SQL -TRIGGER 개념과 예제 본문

Database/Oracle

[Oracle] PL/SQL -TRIGGER 개념과 예제

영보로그 2020. 11. 16. 17:25
반응형

 개념

 

# TRIGGER

 1) 데이터베이스에 미리 정해 놓는 조건에 만족하면 자동으로 이벤트 처리 (오라클에서 처리 → 자바에서는 확인 불가)

 2) TRIGGER : DML(INSERT, UPDATE, DELETE)

 3) 형식

기본 형식
   CREATE [OR REPLACE] TRIGGER tri_name
   BEFORE|AFTER (INSERT,UPDATE,DELETE ON table_name
   BEGIN
      TRIGGER 처리 (다른 테이블 처리)
   END;
 /

삭제
   DROP TRIGGER trigger_name

수정
   ALTER TRIGGER trigger_name 
     → 수정과 동시에 생성

  4) AutoCommit


구분

AutoCommit 
FUNCTION , PROCEDURE 
X

RIGGER  
O

 

                 

 

 

 예제

 

1. 테이블 생성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
-- 상품 
CREATE TABLE 상품(
   품번 NUMBER,
   항목명 VARCHAR2(100),
   단가 NUMBER
);
-- 입고
CREATE TABLE 입고(
   품번 NUMBER,
   수량 NUMBER,
   금액 NUMBER
);
-- 출고
CREATE TABLE 출고(
   품번 NUMBER,
   수량 NUMBER,
   금액 NUMBER
);
-- 재고(자동 처리)
CREATE TABLE 재고(
   품번 NUMBER,
   수량 NUMBER,
   금액 NUMBER
);
cs

 

 

 

2. 컬럼 추가

1
2
3
4
5
6
7
8
9
10
11
INSERT INTO 상품 VALUES(100,'새우깡',1500);
INSERT INTO 상품 VALUES(200,'감자깡',1000);
INSERT INTO 상품 VALUES(300,'맛동산',2000);
INSERT INTO 상품 VALUES(400,'양파링',1800);
INSERT INTO 상품 VALUES(500,'고구마깡',1600);
 
-- 입고 
INSERT INTO 입고 VALUES(100,2,1500);
-- 재고
INSERT INTO 재고 VALUES(100,2,3000);
COMMIT;
cs

 

 

 

3. 재고 자동처리

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
-- 자동 처리 (재고)
CREATE OR REPLACE TRIGGER 입고_trigger
AFTER INSERT ON 입고
FOR EACH ROW
DECLARE
  v_cnt NUMBER;
BEGIN
  SELECT COUNT(*INTO v_cnt
  FROM 재고 
  WHERE 품번=:NEW.품번;
  --품번 (제고)
  --:NEW.품번(입고)
  -- INSERT INTO 입고 VALUES(100,2,1500);
  -- INSERT INTO 재고 VALUES(100,2,3000);
  IF(v_cnt=0) THEN -- 새로운 상품 
    INSERT INTO 재고 VALUES(:NEW.품번,:NEW.수량,:NEW.금액*:NEW.수량);
  ELSE  -- 재고에 있는 상품 
    UPDATE 재고 SET
    수량=수량+:NEW.수량,
    금액=금액+(:NEW.수량*:NEW.금액)
    WHERE 품번=:NEW.품번;
  END IF;
  
END;
/
cs

 

 

4. 조회수 올린 후 조회하기

1
2
3
4
5
6
7
INSERT INTO 입고 VALUES(200,1,1000);
COMMIT;
 
SELECT * FROM 입고;
SELECT * FROM 재고;
INSERT INTO 입고 VALUES(100,3,1500);
COMMIT;
cs

 

 

 

5. 사용해보기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
CREATE OR REPLACE TRIGGER 출고_Trigger
AFTER INSERT ON 출고
FOR EACH ROW
DECLARE
  v_cnt NUMBER;
  /*
       재고
       100 5 7500
       =====> 100 2  3000
       =====> 100 0  0(X)
       출고
       INSERT INTO 출고 VALUES(100,5,1500)
  */
BEGIN
  SELECT 수량-:NEW.수량 INTO v_cnt
  FROM 재고
  WHERE 품번=:NEW.품번;
  
  IF (v_cnt=0) THEN
    DELETE FROM 재고 
    WHERE 품번=:NEW.품번;
  ELSE
    UPDATE 재고 SET
    수량=수량-:NEW.수량,
    금액=금액-(:NEW.수량*:NEW.금액)
    WHERE 품번=:NEW.품번;
  END IF;
  
END;
/
 
SELECT * FROM 재고;
INSERT INTO 출고 VALUES(200,1,1000);
COMMIT;
 
DROP TRIGGER 입고_trigger;
DROP TRIGGER 출고_trigger;
 
SELECT * FROM tab;
cs
반응형