반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- 정보처리기사실기요약
- typescript
- 스프링
- 타입스크립트
- Oracle
- 국비IT
- 오라클
- 정보처리기사정리
- 정보처리기사요약
- VUE
- ReactNative
- react
- 이안의평일코딩
- 자바의정석
- 국비코딩
- spring
- php
- 정보처리기사
- Java의정석
- javascript
- CSS
- 코딩테스트
- 자스코테
- 리액트네이티브
- 정보처리기사실기
- 정보처리기사실기정리
- 자바스크립트
- 자바스크립트 코딩테스트
- 리액트
- 평일코딩
Archives
- Today
- Total
이안의 평일코딩
Oracle 21일차 - Trigger 본문
반응형
2020.11.16(월)
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;
/
4) 삭제
DROP TRIGGER trigger_name
5) 수정
ALTER TRIGGER trigger_name => 수정과 동시에 생성
FUCNTION, PROCEDURE (AutoCommit(X))
TRIGGER (AutoCommit(O))
TRIGGER는 자동처리되서 commit을 주면 오류남
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
|
--상품
CREATE TABLE 상품(
품번 NUMBER,
항목명 VARCHAR2(100),
단가 NUMBER
);
--입고
CREATE TABLE 입고(
품번 NUMBER,
수량 NUMBER,
금액 NUMBER
);
--출고
CREATE TABLE 출고(
품번 NUMBER,
수량 NUMBER,
금액 NUMBER
);
--재고
CREATE TABLE 재고(
품번 NUMBER,
수량 NUMBER,
금액 NUMBER
);
|
cs |
1
2
3
4
5
6
7
8
9
10
11
12
|
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 |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
-- 자동 처리 (재고) 같은 상품이면 수량, 금액만바뀌고 새상품이면 INSERT됨
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.품번(입고)
IF(v_cnt=0) THEN --새로운 상품 들어옴
INSERT INTO 재고 VALUES(:NEW.품번,:NEW.수량,:NEW.금액*:NEW.수량);
ELSE --재고에 있는 상품
UPDATE 재고 SET
수량=수량+:NEW.수량,
금액=금액+(:NEW.수량*:NEW.금액)
WHERE 품번=:NEW.품번;
END IF;
END;
/
|
cs |
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 |
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
|
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,3,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;
|
cs |
PLS-00103 오류
PROCEDURE 을 슬래쉬('/')로 끝내면 된다
ORA-04098 오류
Trigger의 명이 중복되었기 때문에 삭제하고 다시 생성하면 된다
DROP TRIGGER 입고_trigger;
=> CREATE OR REPLACE TRIGGER 입고_trigger .......
자동 조회수 증가
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
|
DESC daum_movie;
ALTER TABLE daum_movie ADD hit NUMBER DEFAULT 0;
CREATE TABLE trigger_reply(
no NUMBER,
mno NUMBER,
name VARCHAR2(34),
msg CLOB,
regdate DATE
);
CREATE OR REPLACE TRIGGER movie_trigger
AFTER INSERT ON trigger_reply
FOR EACH ROW
BEGIN
UPDATE daum_movie SET
hit=hit+1
WHERE no=:NEW.mno;
END;
/
UPDATE daum_movie SET
hit=2
WHERE no=15;
COMMIT;
SELECT * FROM daum_movie WHERE no=15;
|
cs |
반응형
'Back-end > Oracle' 카테고리의 다른 글
Oracle 20일차 - Cursor, Function (0) | 2020.11.11 |
---|---|
Oracle 19일차 - 서브쿼리 (0) | 2020.11.10 |
Oracle 17일차 - 답변형 게시판 (0) | 2020.08.27 |
Oracle 16일차 - 지니뮤직, 멜론뮤직 출력 (0) | 2020.08.26 |
Oracle 15일차 - 인라인뷰 (0) | 2020.08.25 |
Comments