오라클 Trigger 0 4 1,201

by 조남규 [Oracle 기초] 오라클 트리거 [2022.10.18 16:42:51]


오라클로 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 값들로만 출력이됩니다.

 

어떻게 해결하면 좋을지 의견 부탁드립니다...

by 마농 [2022.10.18 17:00:48]

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 하는 방안도 있습니다.


by 조남규 [2022.10.19 11:47:23]

EMP3을 업데이트 했을 때 EMP4 를 전체 DELETE 하고 새로 INSERT로 했더니 원하는데로 데이터는 잘들어갔습니다.!

하지만 혹시 이 방법 말고 다른 방법으로도 접근해보려하는데 쉽지가 않네요,,

UPDATE를 하면 가장 처음값 ex) ab, abc, abcd ->   ab

                                                                  ab

                                                                  ab

요렇게 나와서 생각한대로 안되니 어떻게 접근해야할지 어렵습니다,,


by 마농 [2022.10.19 12:13:58]

update 할게 아니라 개별로 delete 또는 insert 해야 합니다.
접근방법은 이미 위에 댓글로 달았습니다.
다시 한번 읽어 보시길 바랍니다.
만약 'aa,bb' 에서 'aa,cc' 로 바꿨다면?
aa 는 그대로 두고, bb 는 delete 되어야 하고, cc 는 insert 되어야 합니다. update 는 없음.


by 조남규 [2022.10.19 13:29:44]

넵 알겠습니다 감사합니다 ! :  )

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입