반응형
기본 테이블 구조
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;
반응형
'Data Science > SQLP' 카테고리의 다른 글
[SQL] 프로그래머스 SQL (0) | 2022.10.14 |
---|---|
[기술면접 대비] DB 내용 정리 (회복전까지) (0) | 2022.06.25 |
[ORACLE] sqlplus 접속 문제 해결 (0) | 2022.04.12 |
[프로그래머스] 6.String, Date (0) | 2022.03.07 |
[프로그래머스] 5. JOIN (0) | 2022.03.07 |