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이다.