일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 게시판만들기
- spring crud게시판
- 오버라이딩
- 오라클설치
- 2020정보처리기사실기요약
- Oracle기초
- 프로그래머스 쿼리문
- 스프링 CRUD게시판
- 프로그래머스 MYSQL
- jsp게시판만들기
- html기초
- spring crud
- 프로그래머스 SQL
- CRUD게시판만들기
- 스프링게시판만들기
- jsp 팝업띄우기
- 정보처리기사실기정리
- 스프링 crud
- 2020정보처리기사실기정리
- 자바배열예제
- js datepicker
- 정처기실기정리
- 날짜지정팝업
- crud게시판
- 자바기초
- 자바 정규표현식 예제
- 2020정보처리기사실기
- 자바연산자
- PLSQL
- jsp 날짜팝업
Archives
- Today
- Total
영보의 SystemOut.log
[Oracle] PL/SQL -TRIGGER 개념과 예제 본문
반응형
개념
# 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 |
반응형
'Database > Oracle' 카테고리의 다른 글
[Oracle] ORA-00913: 값의 수가 너무 많습니다 (0) | 2021.06.05 |
---|---|
[Oracle] 오라클 Insert 자동 증가 (MAX+1) (0) | 2021.03.12 |
[Oracle]PL/SQL- CURSOR/PROCEDURE vs FUNCTION 과 예제 (1) | 2020.11.13 |
[Oracle] PL/SQL- Procedure(프로시저)와 예제 (1) | 2020.11.11 |
[Oracle] PL/SQL- Cursor(커서)와 예제 (0) | 2020.11.11 |