오라클 Trigger(트리거) 에 관해 질문드립니다! 0 4 957

by 하늘바람 [PL/SQL] 트리거 Trigger 문법 Queryone [2021.03.14 03:21:33]


TG_CORP_BIZ_INFO (사업정보테이블) 이 update 되는 (사업진행상태가 예를들어 신청-> 신청완료) 이벤트가 생길때

트리거가 실행이 됩니다.

 

 

CREATE OR REPLACE TRIGGER OMIS.트리거이름

BEFORE UPDATE
   ON TG_CORP_BIZ_INFO
   FOR EACH ROW
DECLARE
    n NUMBER; 
    sndYn NUMBER;
    contPhone VARCHAR2(30);    --담당자2 번호
    contId VARCHAR2(30);         --담당자2 사번

 

BEGIN
    SELECT COUNT(*) into n 
      FROM TG_CMMN_DTL 
     WHERE GRP_CD = '43' 
       AND USE_YN = 'Y' 
       AND DTL_CD = :new.PROGRS_CD;
    
    SELECT SMS_SND into sndYn
      FROM TG_CNF;
      
    SELECT CONT_ID into contId
      FROM TG_CORP_BIZ_ITEM_INFO 
     WHERE CONT_NUMBER = :new.cont_number;
     
    SELECT CONT_PERSONTEL into contPhone
      FROM TG_CONC_CONT_INFO
     WHERE CONT_ID = contId;

IF  sndYn = 1 AND n > 0 AND :old.PROGRS_CD <> :new.PROGRS_CD THEN

    INSERT INTO TG_SMS
        (
        CONT_NUMBER
        , SND_SN
        , PROGRS_CD
        , MOBILE
        , SND_CD
        , REG_ID
        , REG_DTTM
        , UP_ID
        , UP_DTTM
        )
        VALUES
        (
        :new.CONT_NUMBER
        , (SELECT NVL(MAX(SND_SN), 0) + 1 FROM TG_SMS WHERE CONT_NUMBER = :new.CONT_NUMBER) 
        , :new.PROGRS_CD
        , :new.corp_personmobile
        , 'N'
        , :new.UP_ID
        , SYSDATE
        , :new.UP_ID
        , SYSDATE
        );

     

 

     INSERT INTO TG_SMS
        (
        CONT_NUMBER
        , SND_SN
        , PROGRS_CD
        , MOBILE
        , SND_CD
        , REG_ID
        , REG_DTTM
        , UP_ID
        , UP_DTTM
        )
        VALUES
        (
        :new.CONT_NUMBER
        , (SELECT NVL(MAX(SND_SN), 0) + 1 FROM TG_SMS WHERE CONT_NUMBER = :new.CONT_NUMBER) 
        , :new.PROGRS_CD
        , contPhone
        , 'N'
        , :new.UP_ID
        , SYSDATE
        , :new.UP_ID
        , SYSDATE
        );

 

END IF;

 

END;

 

위의 트리거는 사업진행상태가 바뀔때 담당자에게 문자메세지가 가게 하는 트리거 입니다.

트리거의 내용은 위에 쓰여진 내용입니다. INSERT 구문이 기존에는 한개만 있었는데 하나 더 해서

총 2개의 INSERT문이 실행되게 하고싶은데요. (담당자 1명이 더 생겨서 이 사람한테도 문자메세지가 갈수있도록)

화면단에서 사업진행상태 값을 변경시켜 트리거를 호출하면 INSERT문이 1개일떄는 에러가 안나는데

INSERT문이 1개 더 추가해서 2개가 될떄는 에러메세지가 나옵니다.

에러메세지는 ORA-01400: NULL을 ("OMIS"."TG_SMS"."MOBILE") 안에 삽입할 수 없습니다. 라고 나와요 ㅠㅠ

insert문의 4번째 컬럼 MOBILE이란 컬럼에 NULL이 들어가는 이유가 뭔지요..

Trigger를 거의 다루지않아 이번에 제대로 처음 다뤄보는데 너무 머리가 아픕니다 ;; ㅠ

도와주세요!!! 

 

마지막으로 궁금한점이 있는데요.  하나의 테이블에 2개의 트리거를 적용시킬수 있을까요?

by 뉴비디비 [2021.03.14 13:26:10]

작성하신 내용 오류는 트리거 구문 오류가 아니라 변수처리에 따른 문제라서, 변수 처리를 체크해 보세요. 

기본적으로 트리거는 작성하신것 처럼 한 트리거 안에서 insert 액션 추가 해도 실행되고, 
트리거를 하나 더 생성해도 실행됩니다. 


by 마농 [2021.03.15 08:26:50]

insert문의 4번째 컬럼 MOBILE이란 컬럼에 NULL이 들어가는 이유는?
- contPhone 변수에 널이 들어간거죠.
- 앞선 Select 구문의 실행 결과를 확인해 보세요.


by 하늘바람 [2021.03.25 10:01:02]

뉴비디비님, 마농님 감사합니다. 트리거의 구조와 문법을 좀더 공부를 해야겠습니다. 커서 를 활용하여 해당 문제를 해결하였습니다!

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