[오라클]/PL-SQL

[PL/SQL] TRIGGER

broship 2020. 12. 25. 14:08

TRIGGER 란?
- 어떤 테이블에 dml이 발생했을때 자동으로 실행되는 프로그램 (before 트리거, after 트리거)

 

테이블 생성

CREATE TABLE panmae_table (
    ID   NUMBER(3),
    dan  NUMBER(5),
    soo  NUMBER(5) 
);
--dan: 단가, soo: 수량
 
INSERT INTO panmae_table VALUES (1,1000,200);
INSERT INTO panmae_table VALUES (2,500,50);
SELECT * FROM panmae_table;

--금액 테이블
CREATE TABLE  keum_table (
  ID  NUMBER(3),
  keum NUMBER(10)
);
INSERT INTO keum_table VALUES (1,200000);
INSERT INTO keum_table VALUES (2,25000);
COMMIT;

 

- after 트리거 생성 예시

Q) 판매테이블에서 단가, 수량컬럼중 수량이 변경되면 금액테이블에 단가*수량이 자동으로 적용되는 trigger 프로그램을 작성하시오 

CREATE OR REPLACE TRIGGER kyesan_trigger
AFTER UPDATE OF soo ON panmae_table 
FOR EACH ROW
--컬럼이 하나 바뀔때마다 트리거 실행, 이 옵션 없으면 단 한번만 실행
BEGIN 
UPDATE keum_table
SET keum = :OLD.dan * :NEW.soo
WHERE  ID= :OLD.ID;        
END;
/
 --이제 이거 실행하면 자동으로 트리거가 실행됨
SELECT * FROM keum_table;
UPDATE PANMAE_TABLE
SET SOO=57
WHERE ID=1;
SELECT * FROM keum_table;

 

- before 트리거 생성 예시

Q) 토요일과 일요일에는 작업하지 못하도록 trigger프로그램을 작성하시오

SET SERVEROUTPUT ON 
CREATE OR REPLACE TRIGGER no_working
BEFORE UPDATE OR INSERT OR DELETE ON panmae_table 
--select x
BEGIN 
IF(to_char(sysdate,'day') IN ('토요일','일요일')) THEN  
raise_application_error(-20000,'주말에는 작업을 수행할수 없습니다');
ELSE   
dbms_output.put_line ('Have a good time');
END IF;
END;
/ 
 --업데이트 실행(토,일 요일에 수행시 실행 안됨)
UPDATE panmae_table 
SET soo=300
WHERE ID=1;
 
 --참고) raise_application_error(-20000,'Who ar you');
-- dbms_standard package에 있는 procedure
-- 호출자에게 application 전용의 에러메시지를 리턴함
-- -20000 : user-specified error number로 -20000 ~ -20999까지 가능함

 

 

- 연습문제

--수량 테이블
CREATE TABLE soo_table (
    id NUMBER(3), --상품아이디
    jin NUMBER(5), --진열된수량
    bo NUMBER(5) --보유수량
);
INSERT INTO soo_table VALUES(1,5,20);
INSERT INTO soo_table VALUES(2,3,50);
COMMIT;
--재고 테이블
CREATE TABLE jaeko_table (
    id NUMBER(3), --상품아이디
    jaeko NUMBER(10) --총재고량 = 진열된수량+보유수량
);
INSERT INTO jaeko_table VALUES(1,25);
INSERT INTO jaeko_table VALUES(2,53);
COMMIT;
SELECT * FROM soo_table;
SELECT * FROM jaeko_table;

Q) 다음 단계를 참고하여 마트의 수량테이블에서 진열된수량, 보유수량 컬럼중 보유수량이 변경되면 재고테이블에서 진열된수량 + 보유수량이 자동으로 계산되어 재고수량으로 적용되는 trigger 프로그램을 작성하시오

CREATE OR REPLACE TRIGGER jaeko_trigger
AFTER UPDATE OF bo ON soo_table
FOR EACH ROW
BEGIN
UPDATE jaeko_table
SET jaeko = :OLD.jin + :NEW.bo
WHERE id = :OLD.id;
END;
/
SELECT * FROM jaeko_table;
UPDATE soo_table SET bo = 50 WHERE id=1;
SELECT * FROM jaeko_table;

 

'[오라클] > PL-SQL' 카테고리의 다른 글

[PL/SQL] PROCEDURE  (0) 2020.12.24
[PL/SQL] Anonymous Block  (0) 2020.12.24
[PL/SQL] FUNCTION  (0) 2020.12.24
[PL/SQL] PL/SQL란?  (0) 2020.12.24