오라클로 trigger 공부중인데 문의사항이 생겼습니다.
테이블이 두 개 있다는 가정 하에
table A , table B
A table
이름,전화번호, 직업 등등 ... 이 컬럼으로있을때
insert로
김종국 | 010xxxxxxxx | 가수, 연기자 <- 등록 후
B table
김종국 | 010xxxxxxxx | 가수
김종국 | 010xxxxxxxx | 연기자 <- ,(콤마) 구분자로 분리하는것은 어찌어찌 성공하였습니다. (제약조건 x)
↓
문제는 업데이트 하는 부분에서 막혔는데
가수,연기자,개그맨, mc 등 ,(콤마) 구분자가 늘어나게 되면 아예 가수만 나오거나 한꺼번에 바뀌거나 그런 현상이 나타나는데
해결 방법이 있을까요 ?
원하는 목표
a 테이블 업데이트
김종국 | 010xxxxxxxx | 가수,연기자,개그맨,mc
b테이블
김종국 | 010xxxxxxxx | 가수
김종국 | 010xxxxxxxx | 연기자
김종국 | 010xxxxxxxx | 개그맨
김종국 | 010xxxxxxxx | mc
-----------------------------------------------------------------------------------
CREATE OR REPLACE TRIGGER TRG_TEST3
AFTER INSERT OR UPDATE OR DELETE ON EMP3
FOR EACH ROW
DECLARE
EROLE VARCHAR2(100) := '';
BEGIN
IF INSERTING THEN
INSERT INTO EMP4(ENO, ENAME, EROLE)
--VALUES (:NEW.ENO, :NEW.ENAME, :NEW.EROLE);
SELECT :NEW.ENO, :NEW.ENAME, REGEXP_SUBSTR (:NEW.EROLE, '[^,]+',1, LEVEL) AS PART
FROM DUAL
CONNECT BY LEVEL <= LENGTH (REGEXP_REPLACE(:NEW.EROLE, '[^,]+')) + 1;
ELSIF UPDATING THEN
UPDATE EMP4
--SET EROLE = :NEW.EROLE
SET EROLE = (SELECT REGEXP_SUBSTR (:NEW.EROLE, '[^,]+', 1, LEVEL) AS RESULT
FROM DUAL
CONNECT BY LEVEL IN LENGTH(REGEXP_REPLACE(:NEW.EROLE, '[^,]+', '')) + 1)
WHERE ENAME IN :OLD.ENAME;
END IF;
END TRG_TEST3;
----------------------------------------------------------------------------------------------------------
위 코드로는 insert 했을때 emp4테이블에 ,(콤마)를 기준으로 잘 나눠서 나오는데
update를 했을때는 ,(콤마) 맨 앞에 있는 값만 찍혀서 나오고
예를들어 ab,abc, abcd 이 값을 -> ab,abc,abcd, abced 로 값을 4개로 업데이트하면
row 행은 4개가 아닌 기존 3개의 행이 나오고 ab 값들로만 출력이됩니다.
어떻게 해결하면 좋을지 의견 부탁드립니다...
1. emp3 에 eno 가 키인 듯 하니 emp4 의 조건으로 ename 이 아닌 eno 를 사용해야 합니다.
2. 위에 사용한 REGEXP_REPLACE 방법은 컴마가 없는 경우에는 오동작 할 수 있습니다.
3. enrole 이 같은 걸 찾아서 enrole 을 업데이트 한다는 것은 무의미한 작업입니다.
만약 'aa,bb' 에서 'aa,cc' 로 바꿨다면?
aa 는 그대로 두고, bb 는 delete 되어야 하고, cc 는 insert 되어야 합니다. update 는 없음.
위 사항들을 고려하여 재도전 해보시기 바랍니다.
아니면 복잡하게 구현하지 말고 update 되면 전체 delete 하고 새로 insert 하는 방안도 있습니다.