반응형
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 |
Tags
- ThreadGroup()
- 스레드그룸
- 리눅스셋팅
- include 지시자
- MemoryStream
- include지시자
- StringReader
- include액션태그
- Daemon()
- Linux셋팅
- 동기화
- char[] String 형변환
- String char[] 형변환
- 아이디중복
- first-child
- Linux세팅
- StringWriter
- 메모리스트림
- sleep()메소드
- 리눅스세팅
- interrupt()
- interrupted()
- 상관서브쿼리
- 표현 언어
- InputDialog
- first-of-child
- ObjectInputStream
- ID중복
- 상관 서브 쿼리
- isinterrupted()
Archives
- Today
- Total
다연이네
[days17] 트리거(Trigger) 예제 본문
반응형
1. 상품, 입고, 판매 테이블 생성
CREATE TABLE 상품 (
상품코드 VARCHAR2(6) NOT NULL PRIMARY KEY
,상품명 VARCHAR2(30) NOT NULL
,제조사 VARCHAR2(30) NOT NULL
,소비자가격 NUMBER
,재고수량 NUMBER DEFAULT 0
);
CREATE TABLE 입고 (
입고번호 NUMBER PRIMARY KEY
,상품코드 VARCHAR2(6) NOT NULL CONSTRAINT FK_ibgo_no
REFERENCES 상품(상품코드)
,입고일자 DATE
,입고수량 NUMBER
,입고단가 NUMBER
);
CREATE TABLE 판매 (
판매번호 NUMBER PRIMARY KEY
,상품코드 VARCHAR2(6) NOT NULL CONSTRAINT FK_pan_no
REFERENCES 상품(상품코드)
,판매일자 DATE
,판매수량 NUMBER
,판매단가 NUMBER
);
상품 테이블에 데이터 삽입
INSERT INTO 상품(상품코드, 상품명, 제조사, 소비자가격) VALUES
('AAAAAA', '디카', '삼싱', 100000);
INSERT INTO 상품(상품코드, 상품명, 제조사, 소비자가격) VALUES
('BBBBBB', '컴퓨터', '엘디', 1500000);
INSERT INTO 상품(상품코드, 상품명, 제조사, 소비자가격) VALUES
('CCCCCC', '모니터', '삼싱', 600000);
INSERT INTO 상품(상품코드, 상품명, 제조사, 소비자가격) VALUES
('DDDDDD', '핸드폰', '다우', 500000);
INSERT INTO 상품(상품코드, 상품명, 제조사, 소비자가격) VALUES
('EEEEEE', '프린터', '삼싱', 200000);
COMMIT;
SELECT * FROM 상품;
2. [입고]테이블에 상품이 입고가 되면 [상품]테이블에 상품의 [재고수량]이 수정되는 트리거 작성
create or replace trigger insipgo
after
insert on 입고
for each row
begin
update 상품
set 재고수량 = 재고수량 +:NEW.입고수량
where 상품코드 = :NEW.상품코드;
end;
입고 테이블에 데이터 삽입
INSERT INTO 입고 (입고번호, 상품코드, 입고일자, 입고수량, 입고단가)
VALUES (1, 'AAAAAA', '2004-10-10', 5, 50000); -- :NEW.
INSERT INTO 입고 (입고번호, 상품코드, 입고일자, 입고수량, 입고단가)
VALUES (2, 'BBBBBB', '2004-10-10', 15, 700000);
INSERT INTO 입고 (입고번호, 상품코드, 입고일자, 입고수량, 입고단가)
VALUES (3, 'AAAAAA', '2004-10-11', 15, 52000);
INSERT INTO 입고 (입고번호, 상품코드, 입고일자, 입고수량, 입고단가)
VALUES (4, 'CCCCCC', '2004-10-14', 15, 250000);
INSERT INTO 입고 (입고번호, 상품코드, 입고일자, 입고수량, 입고단가)
VALUES (5, 'BBBBBB', '2004-10-16', 25, 700000);
COMMIT;
select * from 상품;
3. [입고]테이블에 [수량]을 수정하면 [상품]테이블의 [재고수량]도 수정되는 트리거 작성
create or replace trigger upipgo
after
update on 입고
for each row
begin
update 상품
set 재고수량 = 재고수량 - :OLD.입고수량 + :NEW.입고수량
where 상품코드 = :NEW.상품코드;
--BBBB 컴퓨터 엘디 1500000 [40] -> 45
-- 25->30
-- 현재재고수량 40 - 25 +30 ==> 45
end;
4. 입고취소에 해당하는 [상품] 테이블의 [재고수량]도 수정하는 트리거 작성
create or replace trigger delipgo
after
delete on 입고
for each row
begin
update 상품
set 재고수량 = 재고수량 - :OLD.입고수량
where 상품코드 = :OLD.상품코드;
end;
5. [판매]테이블에 자료가 추가 되는 경우 [상품]테이블의 [재고수량]이 변경 되도록 트리거 작성
재고수량 부족하면 오류 발생
create or replace trigger insPan
before
insert on 판매
for each row
declare
vqty number;
begin
select 재고수량 into vqty
from 상품
where 상품코드 = :NEW.상품코드;
if vqty>= :NEW.판매수량 then
update 상품
set 재고수량 = 재고수량 - :NEW.판매수량
where 상품코드 = :NEW.상품코드;
else
raise_application_error(-20007, '재고수량 부족으로 판매 불가');
end if;
end;
INSERT INTO 판매 (판매번호, 상품코드, 판매일자, 판매수량, 판매단가) VALUES
(1, 'AAAAAA', '2004-11-10', 5, 1000000);
COMMIT;
SELECT * FROM 상품;
SELECT * FROM 판매;
6. [판매]테이블의 자료가 변경되는 경우 [상품]테이블의 [재고수량]이 변경되도록 트리거 작성
create or replace trigger upPan
before
update on 판매
for each row
declare
vqty number;
begin
select 재고수량 into vqty
from 상품
where 상품코드 = :NEW.상품코드;
if :NEW.판매수량> (vqty + :OLD.판매수량) then
raise_application_error(-20008, '판매 수정 오류 !!!');
else
update 상품
set 재고수량 = 재고수량 - :new.판매수량 + :old.판매수량
where 상품코드 = :NEW.상품코드;
end if;
--exception
end;
update 판매 set 판매수량=200 where 판매번호=1;
update 판매 set 판매수량=10 where 판매번호=1;
반응형
'Oracle' 카테고리의 다른 글
[days17] 오라클 잡과 스케줄러 (Job, Scheduler) (0) | 2020.11.23 |
---|---|
[days17] PL/SQL의 패키지(Package) (0) | 2020.11.23 |
[days17] 트리거(Trigger)의 :NEW, :OLD **추가 필요 (0) | 2020.11.23 |
[days16] Trigger (트리거) (0) | 2020.11.20 |
[days16] PL/SQL 블록 내에서 에러처리 (0) | 2020.11.19 |
Comments