트리거 질문드립니ㄷㅏ 0 3 1,525

by 조남규 [Oracle 기초] 트리거 오라클 [2022.10.21 17:12:37]


A 테이블의 컬럼이 5개라고 했을 떄 

구분자를 2개 이상 사용하여 

B 테이블에 자동 등록되게끔 만들어 보려고하는데

B테이블은 컬럼이 6개로 만들어서 등록되게끔 만들수 있을까요 ,,??

ex) a테이블

 이름 / 나이 / 지역*직종 / 이메일 등등..

b테이블

이름 / 나이 / 지역 / 직종 / 이메일 등..

이런식으로 가능할까요 ?

 

 

by 마농 [2022.10.24 16:37:03]
CREATE OR REPLACE TRIGGER tr_test
AFTER INSERT
ON t1
FOR EACH ROW
BEGIN
    INSERT INTO t2 (이름, 나이, 지역, 직종, 이메일)
    VALUES( :NEW.이름
          , :NEW.나이
          , SUBSTR(:NEW.지역*직종, 1, INSTR(:NEW.지역*직종, '*') - 1)
          , SUBSTR(:NEW.지역*직종,    INSTR(:NEW.지역*직종, '*') + 1)
          , :NEW.이메일
          ) ;
END;
/

 


by 조남규 [2022.10.25 11:15:12]

감사합니다! 하나만 더 물어봐도될까요~?

만약 트리거로 

insert table t1 -> 지역 * 직종(컬럼) 값

                        대전, 개발자 | 서울, 미용사

-> table2에 값이 들어오길 원하는 상태

                          지역 | 직종          (컬럼)

                         대전  | 개발자

                         서울  | 미용사

요런 형식으로 값이 들어오길 원하는데 지금 상태는

                          지역 | 직종

                          대전 | 서울

                        개발자 | 미용사 

이렇게 값들이 넘어옵니다. 

CREATE OR REPLACE TRIGGER tr_test
AFTER INSERT OR UPDATE OR DELETE ON EMP1
FOR EACH ROW
BEGIN
    IF INSERTING THEN
        INSERT INTO emp2(ENAME, AGE, PLANT, ROLE, EMAIL)
       -- VALUES (:NEW.ENAME, :NEW.AGE, SUBSTR(:NEW.AUTH, 1, INSTR(:NEW.AUTH, '|') -1),
       --         SUBSTR(:NEW.AUTH, INSTR(:NEW.AUTH, '|') +1), :NEW.EMAIL);
        SELECT :NEW.ENAME
                , :NEW.AGE
                , REGEXP_SUBSTR(SUBSTR(:NEW.AUTH, 1, INSTR(:NEW.AUTH, '|') -1), '[^,]+', 1, LEVEL) AS PART1
                , REGEXP_SUBSTR(SUBSTR(:NEW.AUTH, INSTR(:NEW.AUTH, '|') +1), '[^,]+', 1, LEVEL) AS PART2
                , :NEW.EMAIL
        FROM DUAL

       CONNECT BY LEVEL <= LENGTH (REGEXP_REPLACE(SUBSTR(:NEW.AUTH, 1, INSTR(:NEW.AUTH, '|') -1), '[^,]+')) +1;

그래서 tb1에 인서트할 때

대전, 개발자 | 서울, 미용사 ->  개발자 | 서울 <- 이 부분을 replace 치환 방법으로하려는데 이 방법이 맞을까요 ?


by 마농 [2022.10.25 16:53:52]

함수 적용 순서가 틀림
- 오류 : REGEXP_SUBSTR(SUBSTR())
- 수정 : SUBSTR(REGEXP_SUBSTR())
 

CREATE OR REPLACE TRIGGER tr_test
AFTER INSERT OR UPDATE OR DELETE
ON emp1
FOR EACH ROW
BEGIN
    IF INSERTING THEN
        INSERT INTO emp2(ename, age, plant, role, email)
        SELECT :NEW.ename
             , :NEW.age
             , TRIM(REGEXP_SUBSTR(REGEXP_SUBSTR(v, '[^|]+', 1, LEVEL), '[^,]+', 1, 1)) plant
             , TRIM(REGEXP_SUBSTR(REGEXP_SUBSTR(v, '[^|]+', 1, LEVEL), '[^,]+', 1, 2)) role
             , :NEW.email
          FROM (SELECT :NEW.auth v FROM dual)
         CONNECT BY LEVEL <= REGEXP_COUNT(v, '[^|]+')
        ;

    -- 중략 --

END;
/

 

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