DB2에서 Oracle로의 전환 이슈

Mainframe 업무 프로그램을 개방형 시스템으로 전환할 때 DB2 데이터베이스를 Oracle 데이터베이스로 변경함에 따라 업무 프로그램 소스를 변경해야 할 경우가 발생할 수 있다.

이러한 경우는 리호스팅 프로젝트 사이트에서 매우 빈번하게 발생하는 문제이므로 본 절에서는 DB2 데이터베이스를 Oracle 데이터베이스로 변경함에 따라 발생하는 애플리케이션 전환 이슈에 대해 기술한다.

데이터베이스 변경으로 인한 애플리케이션 전환 이슈는 각 데이터베이스 공급업체들이 제공하는 마이그레이션 안내서를 참고한다.

DB2 데이터베이스를 Oracle 데이터베이스로 변경함에 따른 애플리케이션 변경은 다음과 같다.

  • OPTIMIZE … FOR FETCH

    • 유형

      OPTIMIZE FOR 1 ROWS FOR FETCH ONLY
    • 변경 : 주석 처리

  • SET CURRENT PACKAGE

    • 유형

      EXEC SQL
         SET CURRENT PACKAGE = “문자”
      END-EXEC.
    • 변경 : 주석 처리

  • SET :[Host Variable] = CURRENT TIMESTAMP

    • 유형

      EXEC SQL
         SET :[Host Variable] = CURRENT TIMESTAMP
      END-EXEC.
    • 변경 : 주석 처리 및 QUERY 삽입

      EXEC SQL
         SELECT TO_CHAR(SYSTIMESTAMP,’YYYY.MM.DD.HH24.MI.SS.FF6’)
         INTO :[Host Variable]
         FROM DUAL
      END-EXEC.
  • CURRENT TIMESTAMP

    • 유형

      ,[DB Column] = CURRENT TIMESTAMP
    • 변경

      ,[DB Column] = SYSTIMESTAMP
  • EVALUATE

    • 유형

      EVALUATE
         WHEN [조건]…
      END-EVALUATE.
    • 변경

      EVALUATE TRUE
         WHEN [조건]…
      END-EVALUATE.

      EVALUATE 절의 조건이 없을 경우 MF-COBOL에서는 에러를 발생시키며 조건이 없을 경우는 TRUE로 대체해 주어야 한다.

  • SQLSTATE Define

    • 유형

      EXEC SQL
         BEGIN DECLARE SECTION
      END-EXEC.
    • 변경

      • 앞의 유형이 있는 경우: 중간에 SQLSTATE 변수 삽입

      • 앞의 유형이 없는 경우: SQLSTATE 변수 정의

        EXEC SQL
           BEGIN DECLARE SECTION
        END-EXEC.
        
        01 SQLSTATE PIC X(5).
        
        EXEC SQL
           END DECLARE SECTION
        END-EXEC
  • SQLCODE Conversion

    • Case 1

      • 유형

        IF SQLCODE = -811
      • 변경

        IF SQLCODE = -2112
    • Case 2

      • 유형

        IF SQLCODE = -803
      • 변경

        IF SQLCODE = -1
    • Case 3

      • 유형

        WHEN -811 PERFORM [Section Name]
      • 변경

        WHEN -2112 PERFORM [Section Name]
    • Case 4

      • 유형

        WHEN -803 PERFORM [Section Name]
      • 변경

        WHEN -1 PERFORM [Section Name]

      참고

      ORA 02112, 00000, "PCC: SELECT..INTO returns too many rows"
      ORA 00001, 00000, "unique constraint (%s.%s) violated"
  • SET :[Host Variable] = CURRENT DATE

    • 유형

      EXEC SQL
         SET :[Host Variable] = CURRENT DATE
      END-EXEC.
    • 변경

      EXEC SQL
         SELECT TO_CHAR(SYSDATE,’YYYY-MM-DD’)
         INTO :[Host Variable] FROM DUAL
      END-EXEC.
  • CURRENT DATE

    • 유형

      [DB Column] = CURRENT DATE
    • 변경

      [DB Column] = TO_CHAR(SYSDATE,’YYYY-MM-DD’)
  • SET :[Host Variable] = CURRENT TIME

    • 유형

      EXEC SQL
         SET :[Host Variable] = CURRENT TIME
      END-EXEC.
    • 변경

      EXEC SQL
         SELECT TO_CHAR(SYSDATE,’HH24.MI.SS’)
         INTO :[Host Variable] FROM DUAL
      END-EXEC.
  • VALUE Function

    • Case 1

      • 유형

        SELECT VALUE(MAX([DB Column],’’)/VALUE(MIN([DB Column]),’’)
      • 변경

        SELECT NVL(MAX([DB Column]),’’)/NVL(MIN([DB Column]),’’)
    • Case 2

      • 유형

        SELECT VALUE(SUM([DB Column]),0)
      • 변경

        SELECT NVL(SUM([DB Column]),0)
  • DECIMAL Function

    • Case 1

      • 유형

        SELECT VALUE(SUM([DB Column]),DECIMAL(0,15,0))
      • 변경

        SELECT NVL(SUM([DB Column]),0)
    • Case 2

      • 유형

        SELECT VALUE(DECIMAL(0,15,0),SUM([DB Column]))
      • 변경

        SELECT NVL(0,SUM([DB Column]))
    • Case 3

      • 유형

        SELECT VALUE(MAX([DB Column]),DECIMAL(‘’,15,‘’))
      • 변경

        SELECT NVL(MAX([DB Column]),’’)
  • INCLUDE SQLCA

    SQLCABC/SQLERRML/SQLERRD를 사용하면서 SQLCA를 INCLUDE하지 않은 경우 WORKING-STORAGE SECTION에 다음과 같은 문장을 삽입한다.

    EXEC SQL INCLUDE SQLCA END-EXEC.
  • SQLCODE DISPLAY

    DEBUG MODE로 컴파일할 때 컴파일 대상 소스의 SQL 문장에 다음과 같은 문장을 삽입한다.

    DISPLAY ‘[SOURCE NAME]:LINE:[LINE NO]:[I/U/D/S]:SQLCODE:[SQLCODE]’.
    항목 설명

    SOURCE NAME

    DEBUG MODE가 적용되는 SOURCE NAME이다.

    LINE NO

    DISPLAY 문장이 삽입되는 LINE NO이다.

    I/U/D/S

    INSERT/UPDATE/DELETE/SELECT를 의미한다.

    SQLCODE

    수행결과에 대한 SQLCODE이다.