본문 바로가기

Data Science/SQLP

[ORACLE] 트리거 만들기

반응형

기본 테이블 구조

CREATE TABLE VALUE (idx int NOT NULL CONSTRAINT pkkey PRIMARY Key, res int NOT NULL);
SELECT * FROM value;
INSERT INTO value VALUES(1,1);
INSERT INTO value VALUES(2,2);
INSERT INTO value VALUES(3,4);
COMMIT;
DELETE FROM value WHERE idx=1;
DROP TABLE result;
DROP TABLE value;
SELECT * FROM RESULT;

CREATE TABLE RESULT(idx int NOT NULL CONSTRAINT pkkey2 PRIMARY KEY, count int NOT NULL);
CREATE TABLE RESULT(idx int NOT NULL CONSTRAINT fkkey FOREIGN KEY(idx) REFERENCES value(idx), count int NOT NULL);

ALTER TABLE RESULT ADD CONSTRAINT fkkey FOREIGN KEY(idx) REFERENCES value (idx);

 

값이 저장된 테이블에서 값을 파싱해, 값의 개수를 저장하는 테이블 생성

-> 값이 추가 될때마다 개수를 저장하는 테이블에도 추가

-> 트리거 이용

 

기본 트리거

CREATE OR REPLACE TRIGGER trg
AFTER INSERT --INSERT문이 실행되고 난 뒤 자동으로 트리거가 실행
ON value
FOR EACH ROW --이걸 사용안하면 테이블 레벨 트리거에서 NEW 혹은 OLD 참조는 허용되지 않습니다. 오류발생 (:NEW.NAME 쓸수없음)
BEGIN
INSERT INTO RESULT VALUES(:NEW.idx1,:NEW.res); --NAME은 컬럼명
END;

 

CREATE OR REPLACE TRIGGER trg
AFTER INSERT --INSERT문이 실행되고 난 뒤 자동으로 트리거가 실행
ON value
FOR EACH ROW --이걸 사용안하면 테이블 레벨 트리거에서 NEW 혹은 OLD 참조는 허용되지 않습니다. 오류발생 (:NEW.NAME 쓸수없음)
BEGIN
INSERT INTO result VALUES(:NEW.idx1, CASE WHEN :NEW.res == 1 THEN '성공' end)--NAME은 컬럼명
END;
CREATE OR REPLACE TRIGGER trg
AFTER INSERT --INSERT문이 실행되고 난 뒤 자동으로 트리거가 실행
ON value
FOR EACH ROW --이걸 사용안하면 테이블 레벨 트리거에서 NEW 혹은 OLD 참조는 허용되지 않습니다. 오류발생 (:NEW.NAME 쓸수없음)
BEGIN
--INSERT INTO result VALUES(:NEW.idx1, CASE WHEN :NEW.res == 1 THEN '성공' end)--NAME은 컬럼명
	INSERT INTO result(:NEW.idx1, SELECT CASE WHEN value.res=1 THEN '성공'ELSE '에러' end FROM value)
END;

CREATE OR REPLACE TRIGGER trg
AFTER INSERT --INSERT문이 실행되고 난 뒤 자동으로 트리거가 실행
ON value
FOR EACH ROW --이걸 사용안하면 테이블 레벨 트리거에서 NEW 혹은 OLD 참조는 허용되지 않습니다. 오류발생 (:NEW.NAME 쓸수없음)
BEGIN
--INSERT INTO result VALUES(:NEW.idx1, CASE WHEN :NEW.res == 1 THEN '성공' end)--NAME은 컬럼명
	INSERT INTO result(:NEW.idx1, SELECT DECODE(res, 1, '성공', 기타') FROM value)
END;

 

 

결과 트리거

CREATE OR REPLACE TRIGGER trg
AFTER INSERT --INSERT문이 실행되고 난 뒤 자동으로 트리거가 실행
ON value
FOR EACH ROW --이걸 사용안하면 테이블 레벨 트리거에서 NEW 혹은 OLD 참조는 허용되지 않습니다. 오류발생 (:NEW.NAME 쓸수없음)
BEGIN
--INSERT INTO result VALUES(:NEW.idx1, CASE WHEN :NEW.res == 1 THEN '성공' end)--NAME은 컬럼명
	INSERT INTO RESULT values(:NEW.idx1, SELECT DECODE(:NEW.res, 1,2, 3) FROM value);
END;

 

 

 

CREATE OR REPLACE TRIGGER trg
AFTER INSERT --INSERT문이 실행되고 난 뒤 자동으로 트리거가 실행
ON value
FOR EACH ROW --이걸 사용안하면 테이블 레벨 트리거에서 NEW 혹은 OLD 참조는 허용되지 않습니다. 오류발생 (:NEW.NAME 쓸수없음)
BEGIN
	INSERT INTO RESULT (idx2) VALUES (:NEW.idx1);
--AND DECLARE idx_data int(10);
--BEGIN
--	SELECT IDX1 INTO idx_data FROM VALUE v WHERE idx1=:NEW.idx1;
--IF idx_data=1 THEN INSERT RESULT success VALUES (1);
--ELSIF idx_data=2 THEN INSERT RESULT fail VALUES (1);
--ELSIF idx_data=4 THEN INSERT RESULT excep VALUES (1);
--END IF;
--COMMIT;
END;

 

 

최종

CREATE TABLE VALUE (idx1 int NOT NULL CONSTRAINT pkkey PRIMARY Key, res int NOT NULL);
CREATE TABLE RESULT(idx2 int NOT NULL CONSTRAINT pkkey2 PRIMARY KEY, success int,  fail int, excep int);
ALTER TABLE RESULT ADD CONSTRAINT fkkey FOREIGN KEY(idx2) REFERENCES value(idx1);

INSERT INTO value VALUES(1,1);
INSERT INTO value VALUES(2,2);
INSERT INTO value VALUES(3,2);
INSERT INTO value VALUES(4,4);
INSERT INTO value VALUES(5,4);
INSERT INTO value VALUES(6,1);
INSERT INTO value VALUES(7,1);
INSERT INTO value VALUES(8,1);
INSERT INTO value VALUES(9,1);
INSERT INTO value VALUES(10,2);

1이면 -> 성공

2이면 -> 실패

4이면 -> 예외

CREATE OR REPLACE TRIGGER trg
AFTER INSERT
ON value
FOR EACH ROW 
DECLARE idx_data NUMBER(10);
BEGIN
IF (:NEW.res=1) THEN INSERT INTO RESULT (idx2, success) VALUES (:NEW.idx1,1);
ELSIF (:NEW.res=2) THEN INSERT INTO RESULT (idx2, fail) VALUES (:NEW.idx1,1);
ELSIF (:NEW.res=4) THEN INSERT INTO RESULT (idx2, excep) VALUES (:NEW.idx1,1);
END IF;
END;

 

반응형