본문 바로가기

Dev Story/DB

MS SQL->ORACLE 트리거 변환 방법

MS SQL 로 작성된 트리거를  오라클 트리거로 변환할 때 예시를

몇자 적어 볼가 한다.

 

 

[MSSQL]

                                                                         

CREATE TRIGGER [T_EMP_MOVE_AFTER_DELETE] ON  [EMP_MOVE] AFTER DELETE, UPDATE AS 

BEGIN 
      
 DECLARE 

 @OLD$EMP_NO             DECIMAL(19,5), 
 @OLD$DEPT_NO            DECIMAL(19,5), 
 @OLD$EMP_NAME        NVARCHAR(2), 
 
     
 DECLARE CUR CURSOR FOR 
          SELECT EMP_NO , 
                      DEPT_NO,  
                   EMP_NAME,
           FROM DELETED 

 OPEN CUR 

 FETCH NEXT FROM CUR INTO @OLD$EMP_NO, 
                                                   @OLD$DEPT_NO, 
                                                   @OLD$EMP_NAME
 
 WHILE @@FETCH_STATUS = 0 

BEGIN 
IF @OLD$DEPT_NO IN ('10', '11'
BEGIN 
UPDATE EMP_MOVE_HIST A
   SET A.MOVE_CNT = ISNULL(A.MOVE_CNT , 0) + 1
     A.BEFORE_DEPT_NO = @OLD$DEPT_NO
  FROM DELETED 
 WHERE A.EMP_NO    = @OLD$EMP_NO     
   AND A.DEPT_NO =  @OLD$DEPT_NO 
   AND A.EMP_NAME= @OLD$EMP_NAME
END 

ELSE 
BEGIN  
UPDATE EMP_MOVE_HIST
             ~~~~~~~~~~
    END 

  FETCH NEXT FROM CUR INTO @OLD$QTY, 
                                                    @OLD$WGT, 
                                                    @OLD$COMP_CD, 
 
 END 

-- 커서 해제
 CLOSE CUR 
 DEALLOCATE CUR 

END

 

[ORACLE]

 

CREATE TRIGGER T_EMP_MOVE_AFTER_DELETE DELETE OR UPDATE  ON EMP_MOVE AFTER 

FOR EACH ROW


      
BEGIN  

IF DELETING THEN
    IF :OLD.DEPT_NO IN ('10', '11')  THEN
         BEGIN  
            UPDATE EMP_MOVE_HIST A
                  SET A.MOVE_CNT = ISNULL(A.MOVE_CNT , 0) + 1
                  A.BEFORE_DEPT_NO = @OLD$DEPT_NO
                 FROM DELETED  
             WHERE A.EMP_NO    = @OLD$EMP_NO     
              AND A.DEPT_NO =  @OLD$DEPT_NO 
              AND A.EMP_NAME= @OLD$EMP_NAME;
           END;  

    ELSE  

  
           BEGIN   
              UPDATE EMP_MOVE_HIST
              ~~~~~~~~~~;
           END ;

    END IF;

 END IF;
 END;


ⓛ  트리거가 목표가되는 테이블에 어떤시점에 어떤 DML (MSSQL 은 ,로 구분 ORACLE은 OR로 구분)

처리를  할 것인지 정의 한다.

 

② MSSQL 은 커서를 이용해 루프 를 진행 하면서 처리 하였고 ORACLE은 :OLD. (반영전 컬럼값) 키워드를 이용해

     값을 직접 접근한다.

     

반대로 :NEW 는 (반영후 컬럼값)

 

③ MSSQL은 DELETED 를 사용해 테이블 통 으로 가져 올수 있는 반면에  ORACLE은 ②처럼 

컬럼 개별값을 가져 와서 처리를 해야 하고 처리되는 (DELETING) 시점을 가져 올 수 있다.