Mainframe Connector는 표준 COBOL 카피북을 지원하는 ANTLR4 기반 파서를 사용합니다.
이 문서에서는 카피북 파서에서 수행하는 사전 처리 작업, 지원되는 데이터 유형 및 사용 제한사항, qsam decode 및 qsam
encode 명령어로 트랜스코더 구성을 사용하여 구성 필드 수정자를 구성하는 방법을 설명합니다.
사전 처리
카피북을 파싱하기 전에 카피북 파서는 데이터를 사전 처리하고 다음 단계를 수행합니다.
- 주석 줄(7열의
*또는 인라인*>및*>CE주석)을 삭제합니다. - 줄 연속(7열의
-뒤에 따옴표로 묶인 리터럴)을 해결합니다. - 시퀀스 넘버 영역(열 1~6)과 열 73 이상을 비웁니다. 코드는 8열 이상에서 시작해야 합니다.
EJECT,SKIP1,SKIP2,SKIP3,TITLE와 같은 전처리기 관련 문을 보존합니다. 이러한 문은 파싱되지만 무시됩니다.COPY REPLACING에서 사용할 수 있는 전처리기 매개변수가 포함된 카피북은 카피북 파서에서 지원되지 않습니다. 이러한 카피북에서 식별자는 콜론(:)으로 묶입니다.
지원되는 데이터 유형 및 제한사항
다음은 카피북 파서에서 지원하는 데이터 유형과 사용 제한사항입니다.
- 복사 장부에는 단일 최상위
01레코드만 허용되며01레코드에는OCCURS절이 있을 수 없습니다. - 레벨
66(RENAMES/별칭) 및 레벨77(독립형) 필드는 지원되지 않습니다.88수준(조건 이름)은 파싱되고 무시됩니다. - 모든 기본(비그룹) 필드에는 16진수 부동 소수점 필드(
COMP-1및COMP-2)를 제외하고PICTURE절이 있어야 합니다. 다음PICTURE필드가 지원됩니다.- 알파벳(
PIC A), 영숫자(PIC X), 영숫자 수정(A,X,9,B,0,/) PIC G(DBCS,USAGE DISPLAY-1필요)PIC N(국가 또는 DBCS) 및 국가 수정(N,B,0,/)PIC U BYTE-LENGTH n를 포함한PIC U(UTF-8)- 숫자(
9,S,V) 및 숫자 수정($,B,/,V,Z,0,9,,,.,*,+,-,CR,DB).PIC P(확장 위치)는 지원되지 않습니다. - 정밀도가 최대 18인 영역 십진수 및 압축 십진수 필드는 64비트 유형(
LONG또는DECIMAL64)으로 디코딩되고, 정밀도가 더 높은 필드는 임의 정밀도 유형(BIG_INTEGER또는BIG_DECIMAL)으로 디코딩됩니다.schema_validation_mode가BIG_QUERY로 설정된 경우 지원되는 최대 정밀도는 76(BIGNUMERIC)이고 최대 소수 자릿수는 38입니다(POSTGRES의 경우 최대 정밀도는 147,455이고 최대 소수 자릿수는 16,383이며,MYSQL의 경우 최대 정밀도는 65이고 최대 소수 자릿수는 30임).
- 알파벳(
- IBM 16진수 부동 소수점(HFP)은
COMP-1/COMPUTATIONAL-1(단정밀도, 4바이트) 및COMP-2/COMPUTATIONAL-2(배정밀도, 8바이트)를 사용하거나 트랜스코더 구성에서hfp필드 수정자를 적용하여 지원됩니다. REDEFINES절은 재정의된 모든 변형의 바이트 크기가 동일한 경우 정적 크기 필드에서 지원됩니다. 재정의된 필드는OCCURS DEPENDING ON절의 길이 필드 또는null_if수정자의target_field로 참조할 수 없습니다.OCCURS절은 고정 길이 배열(OCCURS n TIMES), 동적 길이 배열(OCCURS min TO max TIMES DEPENDING ON field), 패킹된 동적 길이 배열(OCCURS UNBOUNDED DEPENDING ON field)에 지원됩니다.OCCURS절의ASCENDING/DESCENDING KEY및INDEXED BY구문은 지원되지 않으며DEPENDING ON는 범위 내의 필드 이름을 참조해야 합니다.- 다음
USAGE절만 지원됩니다.DISPLAY(영숫자 및 영역 십진수 필드의 기본값)DISPLAY-1(DBCS)NATIONAL(PIC N필드의 기본값,UTF-16BE로 인코딩됨)UTF-8(PIC U필드의 기본값)BINARY,COMP,COMPUTATIONAL,COMP-4,COMPUTATIONAL-4,COMP-5,COMPUTATIONAL-5COMP-3,COMPUTATIONAL-3,PACKED-DECIMALCOMP-1,COMPUTATIONAL-1,COMP-2,COMPUTATIONAL-2
DATE및TIMESTAMP는 트랜스코더 구성을 사용하여 지원됩니다.- null 표시기는 트랜스코더 구성을 사용하여 지원됩니다.
- 더블 바이트 문자 집합(DBCS) 필드
PIC G및PIC N가 지원됩니다. 기본적으로USAGE절이 없는PIC N필드에는USAGE NATIONAL(UTF-16BE)가 할당됩니다.PIC N필드를 DBCS로 사용하려면 카피북에USAGE DISPLAY-1를 지정하거나 트랜스코더 구성에서 문자 인코딩을 재정의합니다. - 가변 길이 문자열은 트랜스코더 구성을 사용하여 지원됩니다.
SIGN절(LEADING,TRAILING,SEPARATE CHARACTER)이 지원됩니다.- 주석이 지원됩니다.
날짜 및 타임스탬프 필드 지원
Mainframe Connector는 트랜스코더 구성(--transcode-configuration)에서 format_date 및 format_timestamp 필드 수정자를 사용하여 날짜 및 타임스탬프 필드의 디코딩 및 인코딩을 지원합니다. field_suffixes를 사용하여 일치하는 필드에 이러한 수정자를 적용하거나 field_overrides를 사용하여 특정 필드에 적용할 수 있습니다.
{
"field_suffixes": [
{
"suffix": "SUFFIX_STRING",
"modifier": {
"format_date": {
"formats": [
{
"size": FIELD_SIZE,
"pattern": "FORMAT_PATTERN"
}
]
}
}
}
]
}
다음 목록에서는 구성 속성을 자세히 설명합니다.
suffix: 이름이-SUFFIX_STRING또는_SUFFIX_STRING로 끝나는 모든 카피북 필드와 일치합니다(대소문자를 구분하지 않음).suffix에 선행 하이픈이나 밑줄이 포함되지 않았는지 확인합니다. 또는field_overrides를"field": "FIELD_NAME"와 함께 사용하여 개별 필드를 타겟팅합니다.format_date/format_timestamp: 필드를 파싱하거나 형식을 지정하는 데 사용되는 수정자를 정의합니다.format_date는 크기가 지정된 문자열 필드(PIC X) 또는 정수 숫자 필드(예:PIC 9(n),COMP또는COMP-3, 소수 자릿수0, 정밀도 최대 18, 형식 지정 전에 부호 없는 문자열 표현으로 동적으로 변환됨)에 적용할 수 있습니다.format_timestamp는 크기가 지정된 문자열 필드(PIC X)에 적용할 수 있습니다. 타임스탬프는 시간대 또는 오프셋이 패턴에 포함되지 않는 한 UTC로 해석됩니다.
formats:DateTimeFormat객체 목록으로, 각 객체는 다음을 지정합니다.size: 패턴이 적용되는 필드의 크기입니다(문자열 필드의 경우 바이트 길이, 숫자 필드의 경우 정밀도).pattern: 날짜 또는 타임스탬프 패턴입니다. 디코딩(qsam decode) 중에 필드 크기와 일치하는 형식이 일치할 때까지 순서대로 평가됩니다. 인코딩(qsam encode) 중에는 필드 크기와 일치하는 첫 번째 형식만 사용됩니다. 유효한 형식에 대한 자세한 내용은 지원되는 날짜 및 타임스탬프 형식을 참조하세요.
- 서픽스 삭제(선택사항): 출력 필드 이름에서
-SUFFIX_STRING또는_SUFFIX_STRING를 삭제하려면 트랜스코더 구성의transformations배열에rename변환을 추가합니다.
예시
-DT8또는_DT8로 끝나는 8바이트 필드를yyyyMMdd패턴을 사용하여DATE로,-DT또는_DT로 끝나는 10바이트 필드를MM-dd-yyyy또는MM/dd/yyyy로 형식 지정하려면 다음 안내를 따르세요.{ "field_suffixes": [ { "suffix": "DT8", "modifier": { "format_date": { "formats": [ { "size": 8, "pattern": "yyyyMMdd" } ] } } }, { "suffix": "DT", "modifier": { "format_date": { "formats": [ { "size": 10, "pattern": "MM-dd-yyyy" }, { "size": 10, "pattern": "MM/dd/yyyy" } ] } } } ] }-TIMESTAMP,_TIMESTAMP,-TS또는_TS로 끝나는 26바이트 필드를yyyy-MM-dd HH.mm.ss.SSSSSS패턴을 사용하여TIMESTAMP로 형식 지정하고 출력 열 이름에서 서픽스를 삭제하려면 다음 안내를 따르세요.{ "field_suffixes": [ { "suffix": "TIMESTAMP", "modifier": { "format_timestamp": { "formats": [ { "size": 26, "pattern": "yyyy-MM-dd HH.mm.ss.SSSSSS" } ] } } }, { "suffix": "TS", "modifier": { "format_timestamp": { "formats": [ { "size": 26, "pattern": "yyyy-MM-dd HH.mm.ss.SSSSSS" } ] } } } ], "transformations": [ { "rename": { "find": "^(.*)[-_](TIMESTAMP|TS)$", "replace": "$1" } } ] }
null 표시기 지원
Mainframe Connector는 트랜스코더 구성(--transcode-configuration)의 null_if 필드 수정자를 통해 null 표시기를 지원합니다.
서픽스 기반 null 표시기(COL1-NID와 같은 필드가 동일한 레코드에서 COL1의 null 표시기 역할을 함)를 구성하려면 "is_inverse": true 및 "target_field": "$self"를 사용하여 field_suffixes에 항목을 정의합니다.
{
"field_suffixes": [
{
"suffix": "NULL_INDICATOR_NAME",
"is_inverse": true,
"modifier": {
"null_if": {
"target_field": "$self",
"null_value": "NULL_VALUE",
"non_null_value": "NOT_NULL_VALUE"
}
}
}
]
}
다음 목록에서는 null 표시기를 구성하는 데 사용할 수 있는 매개변수를 설명합니다.
suffix: 카피북에서 null 표시기 필드를 식별하는 서픽스-NULL_INDICATORNAME또는NULL_INDICATOR_NAME에 해당합니다.is_inverse:FieldSuffix에서true로 설정하면 수정자가 서픽스가 없는 표시기 필드와 이름이 일치하는 동위 필드에 적용되고(예: 표시기가COL1-NID1인 경우COL1)"$self"는 표시기 필드 자체를 참조합니다.field_overrides를 사용하여 특정 필드에 직접null_if를 적용하고target_field를 표시기 필드의 이름으로 설정할 수도 있습니다.null_value또는null_values: 참조된 필드가null임을 나타내는target_field의 단일 값(null_value) 또는 값 목록(null_values)을 지정합니다.non_null_value또는non_null_values: (선택사항)target_field에서 단일 값(non_null_value) 또는 값 목록(non_null_values)을 지정하여 참조된 필드가null가 아님을 나타냅니다. 생략하면null_value또는null_values이외의 값은 null이 아닌 것으로 처리됩니다.null_value(s)또는non_null_value(s)중 하나를 지정해야 합니다.- null 표시기 필드 제외 또는 유지: 기본적으로 null 표시기 필드는 출력 스키마의 열로 유지됩니다. 트랜스코딩 중에 null 표시기 필드를 사용하면서 출력 테이블에서 생략하려면
transformations배열의 표시기 필드에exclude변환을 추가합니다(filler는 필드 디코딩을 완전히 건너뛰므로 null 표시기 필드에filler수정자를 적용하지 마세요). - 표시기 필드 유형 재정의: (선택사항) null 표시기 필드를
bytes또는binary로 디코딩하려면"modifier": { "bytes": {} }또는"modifier": { "binary": {} }를 사용하여 표시기 필드에 비역field_suffixes(또는field_overrides) 규칙을 추가합니다.bytes의 경우null_value및non_null_value를 16진수 문자열로 표현합니다(예:"FF"또는"00").
예시
다음 예시에서 COL1-NID1 및 FIELD-NID2는 null 표시기로 평가된 후 출력 테이블에서 제외되지만 COL2-NULL는 출력 스키마에 유지됩니다.
카피북 스니펫:
01 REC.
10 COL1-NID1 PIC S9(4) USAGE COMP.
10 COL1 PIC S9(6) USAGE COMP.
10 FIELD PIC X(10).
10 FIELD-NID2 PIC X(1).
10 COL2 PIC X(10).
10 COL2-NULL PIC X(1).
트랜스코더 구성(transcode-configuration.json):
{
"field_suffixes": [
{
"suffix": "NID1",
"is_inverse": true,
"modifier": {
"null_if": {
"target_field": "$self",
"null_value": "-1",
"non_null_value": "0"
}
}
},
{
"suffix": "NID2",
"is_inverse": true,
"modifier": {
"null_if": {
"target_field": "$self",
"null_value": "?"
}
}
},
{
"suffix": "NULL",
"is_inverse": true,
"modifier": {
"null_if": {
"target_field": "$self",
"null_value": "?"
}
}
}
],
"transformations": [
{
"exclude": {
"field": "COL1-NID1"
}
},
{
"exclude": {
"field": "FIELD-NID2"
}
}
]
}
DBCS 필드 지원
DBCS 필드(USAGE DISPLAY-1가 있는 PIC G 또는 PIC N)를 사용할 때는 다음을 확인하세요.
PIC G필드는USAGE DISPLAY-1를 명시적으로 지정해야 합니다.USAGE절이 없는PIC N필드는 기본적으로USAGE NATIONAL(UTF-16BE)입니다.PIC N필드를 DBCS 필드로 처리하려면 카피북에USAGE DISPLAY-1를 지정하거나 트랜스코더 구성에서 인코딩을 재정의합니다.- 기본적으로
USAGE DISPLAY-1필드는 시프트 아웃(0x0E) 및 시프트 인(0x0F) 제어 문자 없이 원시 DBCS 바이트를 예상하는cp300(x-IBM300) DBCS 문자 집합을 사용하여 디코딩 및 인코딩됩니다. - 다른 DBCS 문자 집합(예:
Cp834) 또는 시프트 아웃(0x0E) 및 시프트 인(0x0F) 바이트를 사용하는 멀티바이트 문자 집합(MBCS)(예:x-IBM930,x-IBM933,x-IBM935,x-IBM937,x-IBM939,x-IBM942,x-IBM942C,x-IBM943,x-IBM943C,x-IBM949,x-IBM949C,x-IBM950,x-IBM964,x-IBM970,x-IBM1364)을 사용하려면 트랜스코더 구성(--transcode-configuration)에서string필드 수정자를 구성합니다.
defaults.dbcs를 사용하여 모든 USAGE DISPLAY-1 필드에 대해 전역적으로 DBCS 인코딩을 설정하거나 field_overrides 또는 field_suffixes를 사용하여 특정 필드에 대해 설정할 수 있습니다.
{
"defaults": {
"dbcs": {
"string": {
"encoding": "x-IBM930"
}
}
}
}
가변 길이 문자열 지원
카피북 파서는 트랜스코더 구성에서 varlen 필드 수정자를 사용하여 가변 길이 문자열 그룹 필드를 지원합니다.
10 VAR-GRP.
15 VAR-LEN PIC 9(4) USAGE COMP.
15 VAR-TEXT PIC X(50).
varlen 필드 수정자를 사용할 때는 다음 사항을 확인하세요.
트랜스코더 구성에서
field_overrides또는field_suffixes를 사용하여 그룹 항목(예:VAR-GRP)에varlen수정자를 적용합니다.{ "field_overrides": [ { "field": "VAR-GRP", "modifier": { "varlen": {} } } ] }그룹 항목에는 정확히 두 개의 하위 필드가 포함되어야 합니다.
- 첫 번째 하위 필드는 문자열 데이터의 바이트 길이를 지정하는 64비트 정수(
LONG, 예: 바이너리COMP또는 존 십진수 정수 필드)로 디코딩되어야 합니다. - 두 번째 하위 필드는 수정되지 않은 문자열 필드(예:
PIC X(n),PIC N(n)또는PIC U(n))여야 합니다.
- 첫 번째 하위 필드는 문자열 데이터의 바이트 길이를 지정하는 64비트 정수(
특정 하위 필드 서픽스(예:
-LEN또는-TEXT)는 필요하지 않으며 출력 스키마의 결과 열은 그룹 항목의 이름(VAR-GRP)을 사용합니다.
지원되지 않는 필드 및 구조
다음 섹션에서는 카피북 파서에서 지원되지 않는 필드와 구문을 설명합니다.
지원되지 않는 COBOL 구조
카피북 파서는 다음 COBOL 구문을 지원하지 않지만 파싱할 수 있습니다. 카피북에서 이러한 구문을 사용하면 Mainframe Connector에 오류가 표시됩니다.
ALIGNEDBLANK WHEN ZEROCOMMON,OWN,LOCALDYNAMIC LENGTH(예:PIC X DYNAMIC LENGTH또는PIC U DYNAMIC LENGTH LIMIT n)INTEGER,STRINGJUSTIFIEDOCCURS의ASCENDING/DESCENDING KEYOCCURS의INDEXED BYRECEIVED BYRECORD AREARENAMESSYNCHRONIZED/SYNCTHREAD-LOCALTYPE IS ...TYPEDEFUSING LANGUAGE/CONVENTION
지원되지 않는 데이터 유형
다음 USAGE 유형은 문법으로 파싱할 수 있지만 카피북 컴파일러에서 지원되지 않습니다.
BITCONTROL-POINTDATEDOUBLEEVENTFUNCTION-POINTERINDEXKANJILOCKPOINTERPROCEDURE-POINTERREALSQLTASK