스키마 파일의 구조
Mainframe 데이터셋을 OpenFrame 데이터셋으로 정확하게 변환하기 위해서는 원본 데이터셋에 대한 레이아웃 분석이 가장 중요하다. 이를 위해서는 COBOL Copybook 형태 또는 PL/I Include 형태의 자료를 참고해서 데이터셋 전환 스키마(Data Set Conversion Schema) 파일을 생성해야만 한다.
본 절에서는 이 과정에서 생성된 스키마 파일(v7.1)의 구조 및 형태와 필요한 항목의 용어들을 설명한다.
1. 스키마 파일의 구조(v7.1)
OpenFrame에서는 cobgensch, pligensch, sqlgensch 툴을 사용하여 스키마 파일을 생성할 수 있다.
스키마에는 일반 변환 스키마와 동적 변환 스키마가 있다.
-
일반 변환 스키마
* Schema Version 7.1 Label, Level, Field Name, Conversion Type, Sign Type, Length, Occurs, ODO Field * Condition Label, "Value", ( Label List )
-
동적 변환 스키마
동적 변환 스키마에는 일반 변환 스키마 구조에 Redefine Group ID와 Redefine Element ID가 더 있다. 다음은 동적 변환 스키마 파일의 구조이다.
* Schema Version 7.1 - Dynamic conversion Label, Level, Field Name, Conversion type, Sign type, Length, Occurs, ODO Field, Redefine Group ID, Redefine Element ID * Condition Label, "Value", ( Label List )
|
위 구조의 각 항목에 대한 설명은 다음과 같다.
항목 | 설명 |
---|---|
Label |
각 필드에 대한 유일한 Label 값을 나타낸다. |
Level |
필드가 위치한 Level을 나타낸다. |
Field Name |
각 필드의 이름을 가리킨다. |
Conversion Type |
각 필드가 어떠한 데이터 타입으로 이루어져 있는지를 나타낸다. 스키마 파일의 Conversion Type 항목에 대응되는 데이터 타입에 대한 설명은 다음과 같다.
|
Sign Type |
숫자 필드에 대해 COBOL의 SIGN IS 절로 정의된 부호 타입을 나타내며, default는 TRAILING이다. 스키마 파일의 Sign Type 항목에 대응되는 부호 타입에 대한 설명은 다음과 같다.
|
Length |
필드의 길이를 나타낸다. |
Occurs |
Occurs 반복 횟수를 나타낸다. |
ODO Field |
Occurs Depending On이 가리키는 필드 이름을 나타낸다. |
Redefine Group ID |
재정의문(REDEFINES)을 사용한 경우 이를 사용한 그룹의 ID를 의미한다. |
Redefine Element ID |
Redefine Group ID내에서의 항목별 ID이다. |
COND 문
스키마 파일의 Condition 절은 Copybook의 $$COND문에 의해서 만들어지는 구문으로 $$COND문의 구조는 다음과 같다.
$$COND : FIELD_01 : VALUE_01 (, VALUE02 … ) [: FIELD_02 : VALUE_03 (, VALUE04 ) … ] : REDEFINE_NAME [...]
'FIELD_# : VALUE_#' 조건이 여러 번 사용될 경우에도 각 조건들을 콜론(:)으로 분리할 수 있고, 각 필드에서도 조건값(VALUE)들이 여러 개 비교할 수 있다. 그리고 이 조건값과 일치할 경우 재정의문(REDEFINES)가 사용되는 구조이다. 재정의문(REDEFINES)에 관한 자세한 내용은 [sect_redefines]을 참고한다.
Condition 절
$$COND 문에 대응되는 스키마 파일의 Condition 절의 자세한 구조과 설명은 다음과 같다.
L#1, "VALUE_01" "VALUE02" … [, L#2, "VALUE_03" "VALUE04 … ], ( Label List )
항목 | 설명 |
---|---|
Label(L#) |
재정의문에 정의된 필드의 레이블 번호를 나타낸다. |
조건값(VALUE_#) |
재정의문에서 정의된 레이블의 필드값과 비교하게 될 값(VALUE)을 말하고 일치하는 경우 레이블 리스트에 있는 순서대로 레이아웃이 구성된다. 한 레이블의 필드값을 여러 개의 조건값과 비교할 수 있고, 이때 조건값들은 OR로 연결되어 있는 경우로 생각할 수 있다. 여러 레이블의 조건문을 콤마(,)로 구분해서 조건값과 비교할 수 있다. |
Label List |
레이블의 필드 값과 조건값이 일치할 때 구성되는 레이블 순서를 리스트로 나타낸다. |
1.1. ODO(Occurs Depending On) 항목
ODO 구문이란 다른 필드에 저장되어 있는 값을 참조하여 OCCURS 횟수를 정할 때 사용할 수 있는 옵션 항목으로 아래 Copybook 샘플을 참고하면 ODO 옵션을 사용한 예를 볼 수 있다.
ODO 구문에 지정하는 OCCURS 횟수는 Min/Max(한 개의 반복 횟수만 지정되었을 경우에는 Max 값) 값을 의미하는 것이지, 실제 반복 횟수를 가리키지 않는다. 그리고 ODO 구문이 추가되지 않은 경우에는 OCCURS 반복 횟수는 기본적으로 1이 설정된다.
현재 OpenFrame에서는 레이아웃 내에 정의되어 있는 필드에 대해서만 ODO Field를 지정할 수 있으며, 레이아웃 외에 지정된 필드는 지정할 수 없다. |
다음은 위에서 설명한 ODO 항목이 포함된 COBOL Copybook과 생성된 스키마 파일의 샘플이다.
<COBOL Copybook>
01 ROOT. 03 AAA PIC X(1). 03 ODO OCCURS 10 DEPENDING ON AAA. 05 BBB PIC S9(2). 03 CCC PIC X(1) OCCURS 5.
<Schema File>
* Schema Version 7.1 L1, 01, ROOT, NULL, NULL, 0, 1:1, L2, 03, AAA, EBC_ASC, NULL, 1, 1:1, L3, 03, ODO, NULL, NULL, 0, 1:10, AAA L4, 05, BBB, ZONED, TRAILING, 2, 1:1, L5, 03, CCC, EBC_ASC, NULL, 1, 1:5, * Condition L0, "\0", ( L1 L2 L3 L4 L5 )
위에서 마지막 L0가 있는 Condition 문은 디폴트 조건일 때 구성되는 레이아웃 순서를 리스트로 나타낸 것이다. 자세한 내용은 재정의문(REDEFINES)이 사용되는 데이터셋를 참고한다.
1.2. 재정의문(REDEFINES)
재정의문(REDEFINES)이 들어있는 레이아웃을 가진 데이터셋의 경우에는 어떤 조건에 의해서 분기하는지에 대한 정보가 있어야 한다. 재정의문(REDEFINES)에 관한 자세한 내용은 재정의문(REDEFINES)이 사용되는 데이터셋을 참고한다.
다음은 재정의문이 사용된 COBOL Copybook과 스키마 파일의 샘플이다.
<COBOL Copybook>
01 ROOT. 03 AAA PIC X(2). 03 BBB PIC X(3). 03 BBB-1 PIC S9(3) REDEFINES BBB. 03 CCC PIC X(3). 03 CCC-1 PIC 9(5) COMP-3 REDEFINES CCC. $$COND : AAA : "AB" : BBB-1 ( multiple redefines can be defined here!) $$COND : CCC : T"PACKED" : CCC-1
<Schema File>
* Schema Version 7.1 L1, 01, ROOT, NULL, NULL, 0, 1:1, L2, 03, AAA, EBC_ASC, NULL, 2, 1:1, L3, 03, BBB, EBC_ASC, NULL, 3, 1:1, L4, 03, BBB-1, ZONED, TRAILING, 3, 1:1, # REDEFINES BBB L5, 03, CCC, EBC_ASC, NULL, 3, 1:1, L6, 03, CCC-1, U_PACKED, NULL, 3, 1:1, # REDEFINES CCC * Condition L2, "AB", ( L1 L2 L4 L5 ) L5, T"PACKED", ( L1 L2 L3 L6 ) L0, "\0", ( L1 L2 L3 L5 )
위에서 Copybook과 스키마 파일의 첫번째 조건문을 비교했을 때 AAA라는 필드명에 대응 되는 것이 L2(Label2)와 같고, 이 필드에 해당하는 조건값이 "AB"인 경우 재정의문이 실행되므로 L1, L2, L4, L5 순서로 필드 레이아웃이 구성된다. 두번째 조건문을 비교했을 때 CCC라는 필드명에 대응되는 것이 L5(Label5)와 같고, 이 필드에 해당하는 조건값이 T"PACKED"인 경우 즉, L5에 대응되는 offset 값이 Packed decimal인 경우 재정의문이 실행되므로 L1, L2, L3, L6 순서로 필드 레이아웃이 구성된다. 마지막 L0는 default로 구성되는 레이아웃 순서 리스트로 나타낸 것이다.
1.3. 조건값(VALUE)의 타입
Copybook $$COND문에 대응되는 스키마 파일의 Condition 절의 조건값들은 여러 개의 타입으로 지정하여 해당 필드의 타입을 사용하지 않고 원하는 타입으로 변환할 수 있다. 이때 조건값을 쓰기 위한 따옴표(" ") 앞에 사용자 지정 타입을 넣을 수 있다. 조건값(VALUE)의 타입에 관한 자세한 내용은 재정의문(REDEFINES)이 사용되는 데이터셋을 참고한다.
사용자 지정 필드 타입은 다음과 같다.
타입 | 설명 |
---|---|
! (느낌표) |
NOT EQUALITY를 체크한다. |
'(empty)' |
해당 필드의 디폴트 타입으로 변환한다. |
'A' |
입력한 값을 ASCII 문자 그대로 사용한다. |
'E' |
EBCDIC 문자로 변환한다. |
'P' or 'UP' |
Packed Decimal 또는 Unsigned Packed Decimal 포맷으로 변환한다. |
'Z' or 'UZ' |
Zoned Decimal 또는 Unsigned Zoned Decimal 포맷으로 변환한다. |
'G' |
GRAPHIC(2Byte) 문자로 변환한다. |
'H' |
입력한 값을 Hexadecimal 값으로 변환한다. (예: H"123" → 0x7B) |
'X' |
입력한 2Byte 값을 1Byte Hexa값으로 변환한다. (예: X"12AB" → 0x12 0xAB) |
'T' (Zoned, Packed 만 지원) |
해당 필드 타입을 확인한다. (예: T"ZONED"/T"PACKED" → 해당 필드가 Zoned/Packed Decimal인지 확인) |