데이터 변환
서로 다른 런타임 환경에서는 데이터가 해석되는 방법이 다르므로 사용자 프로그램은 한 환경에서 다른 환경으로 전달되는 데이터를 변환해야 할 수도 있습니다. Java™ 환경에서 COBOL 환경으로, COBOL에서 Java로 이동되는 데이터에는 항상 데이터 변환이 필요합니다. 데이터 변환은 COBOL 준비 시와 COBOL 또는 Java 런타임 시 발생합니다.
아랍어 또는 히브리어와 같은 양방향 언어를 지원하는 프로그램은 양방향 변환표를 사용하여 코드 페이지 변환 외에 텍스트 데이터의 재정렬을 지정할 수 있습니다. 양방향 변환표 작성에 대한 정보는 "양방향 언어 텍스트" 주제를 참조하십시오.
COBOL 준비 프로세스는 워크스테이션 기반 파일을 빌드 서버로 전송할 때 파일 컨텐츠, 파일 경로 정보 및 환경 변수의 값을 변환합니다. 이러한 경우 데이터 변환표를 설정하는 데 필요한 단계에 대해서는 이 주제의 후반부에 설명되어 있습니다.
- 생성된 Java 코드는
다른 코드 페이지를 사용하는 다른 시스템에서 프로그램을
호출합니다(예를 들어, Java 프로그램이
z/OS®에서 프로그램을 호출함).
이 경우 호출된 프로그램을 참조하는 callLink 요소에 변환표를 지정할 수 있습니다. 또는 sysVar.callConversionTable 시스템 변수가 런타임에 변환표를 식별함을 표시할 수 있습니다(해당 callLink 요소에서).
- 생성된 Java 코드는
EGL 원격 바인딩을 사용하여 서비스를 호출합니다.
이 경우 EGL 배치 디스크립터(.egldd) 파일에서 EGL 바인딩에 변환표를 지정할 수 있습니다. 로컬 외의 프로토콜에 대해 conversionTable 특성을 설정하여 변환표를 지정하십시오.
- 생성된 COBOL 프로그램이 ASCII 문자 세트를 지원하는 원격
플랫폼에 있는 프로그램을 호출합니다.
이 경우 호출된 프로그램을 참조하는 callLink 요소에 변환표를 지정할 수 있습니다. 또는 sysVar.callConversionTable 시스템 변수가 런타임에 변환표를 식별함을 표시할 수 있습니다(해당 callLink 요소에서).
- 생성된 CICS® COBOL
프로그램(EBCDIC 문자 세트를 지원하는 플랫폼에서)은
프로그램이 vgLib.startTransaction 시스템 함수를 호출할 때
발생하는 바와 같이 ASCII 문자 세트를 지원하는 플랫폼에서 비동기로 프로그램을
시작합니다.
이 경우 vgLib.startTransaction 시스템 함수에서 사용되는 레코드를 참조하는 asynchLink 요소에 변환표를 지정할 수 있습니다. 또는 sysVar.callConversionTable 시스템 변수가 런타임에 변환표를 식별함을 표시할 수 있습니다(해당 asynchLink 요소).
이는 Java 프로그램의 경우에 가능하지 않습니다. Java의 vgLib.startTransaction 함수는 로컬 시스템에 있는 프로그램만 시작하기 때문입니다. 모든 프로그램이 로컬이므로 변환이 필요하지 않습니다.
- 생성된 CICS COBOL
프로그램은 ASCII 문자 세트를 지원하는 플랫폼에서 VSAM 파일 또는
CICS 임시 데이터 큐에 액세스합니다.
이 경우 파일 또는 데이터 큐를 참조하는 fileLink 요소에 변환표를 지정할 수 있습니다. 또는 sysVar.callConversionTable 시스템 변수가 런타임에 변환표를 식별함을 표시할 수 있습니다(해당 fileLink 요소에서).
- 생성된 Java 프로그램은 일련의 아랍어 또는 히브리어 문자가 포함된 텍스트 또는 인쇄 양식을 표시하거나 사용자로부터 이러한 일련의 문자를 허용하는 텍스트 양식을 표시합니다. 이러한 경우 sysVar.formConversionTable 시스템 변수에 양방향 변환표를 지정합니다.
- 런타임 언어를 알지 못하므로 생성 시 지정할 변환표를
모르는 경우. 이 경우
다음을 수행하십시오.
- callLink, asynchLink 또는 fileLink 요소에 conversionTable 특성을 설정하여 PROGRAMCONTROLLED를 지정하십시오.
- 프로그램에서 사용자의 입력에 기반하여 런타임에 sysVar.callConversionTable 시스템 변수의 값을 설정하십시오.
- 프로그램은 다른 프로그램에 레코드를 전달하지만 다른 레코드
변수가 전달 중인 레코드를 재정의합니다. 레코드 및
해당 재정의는 모두 메모리의 동일한 영역을 참조하지만 레코드에
있는 데이터의 실제 구조와 유형은 호출에 실제로 사용 중인
재정의에 따라 다릅니다. 따라서 데이터 변환의
요구사항도 사용 중인 재정의에 기반하여 런타임에
다양합니다. 이 경우 다음을 수행하십시오.
- callLink, asynchLink 또는 fileLink 요소에 conversionTable 특성을 설정하여 PROGRAMCONTROLLED를 지정하십시오.
- 프로그램에서, 자동 변환을 수행하지 않도록 표시하기 위해 sysVar.callConversionTable 시스템 변수의 값을 공백으로 설정하십시오.
- 프로그램에서, 필요한 레코드 구조에 해당하는 레코드 변수를 변환하기 위해 sysLib.convert 시스템 함수를 호출하십시오. sysLib.convert 함수를 사용하면 사용자의 입력에 기반하여 필요한 변환표를 지정할 수도 있습니다.
z/OS COBOL 환경에서 변환표 사용자 정의에 대한 정보는 IBM Rational® COBOL Runtime Guide for zSeries를 참조하십시오.
COBOL 프로그램 생성 시 데이터 변환
COBOL이 워크스테이션에서 생성되고 z/OS 또는 iSeries 빌드 서버에서 준비되는 경우 변환은 clientCodeSet 및 serverCodeSet 빌드 디스크립터 옵션에서 사용자의 지정에 따라 빌드 서버에서 처리됩니다. 이러한 각 빌드 디스크립터 옵션은 z/OS 및 iSeries의 ICONV 변환 서비스에 정의된 코드 세트를 식별해야 하며 지정되지 않은 경우에 기본 설정이 사용됩니다.
아랍어 또는 히브리어와 같은 양방향 언어를 지원하는 프로그램에서도 코드 페이지 변환 외에 텍스트 리터럴을 다시 정렬해야 할 수 있습니다. 자세한 정보는 "양방향 언어 텍스트"를 참조하십시오.
생성된 COBOL 프로그램에서 런타임 시 데이터 변환
생성된 COBOL 프로그램이 ASCII 문자 세트를 지원하는 원격 CICS 리젼에서 프로그램 또는 파일에 액세스할 때 변환표에 따라 호출자에서 변환이 발생합니다. 이 경우 변환표는 코드 페이지 변환에 대한 정보가 있는 로드 모듈입니다.
다음의 표는 EGL과 함께 제공되며 생성된 COBOL 프로그램이 런타임 시 액세스할 수 있는 변환표를 나열합니다. 이러한 변환표는 EBCDIC 형식과 Windows 2000/NT/XP ASCII 코드 페이지 간에 데이터를 변환합니다.
| 언어 | 테이블 이름 |
|---|---|
| 브라질 포르투갈어 | ELACNPTB |
| 중국어 | ELACNCHS |
| 대만어 | ELACNCHT |
| 영어, 대문자 | ELACNENP |
| 영어, 미국 | ELACNENU |
| 프랑스어 | ELACNFRA |
| 독일어 | ELACNDEU |
| 이탈리아어 | ELACNITA |
| 일본어, 가타카나(1바이트 문자 세트) | ELACNJPN |
| 한국어 | ELACNKOR |
| 스페인어 | ELACNESP |
| 스위스 독일어 | ELACNDES |
생성된 Java 프로그램에서 런타임 시 데이터 변환
- 생성된 Java 프로그램 또는 랩퍼가 생성된 Java 프로그램을 호출할 때
런타임에 시작된 EGL 클래스 세트에 따라 호출 프로그램에서 변환이
발생합니다. 호출자가 인보커가 사용하는 코드 페이지와 다른
코드 페이지를 사용하는 원격 플랫폼에 액세스하는 경우에도 대부분의 경우
변환이 필요하지 않습니다. 그러나 다음과 같은 경우
변환표를 지정해야 합니다.
- 호출 프로그램이 Java 코드이고 하나의 코드 페이지를 지원하는 시스템에 있는 경우
- 호출된 프로그램이 비Java 프로그램이고 다른 코드 페이지를 지원하는 시스템에 있는 경우
이 경우 테이블 이름은 런타임에 필요한 변환의 종류를 표시하는 기호입니다.
- 생성된 Java 프로그램이 원격 WebSphere® MQ 메시지 큐에 액세스하는 경우 런타임에 시작된 EGL 클래스 세트에 따라 호출자에서 변환이 발생합니다. 호출자가 인보커가 사용하는 코드 페이지와 다른 코드 페이지를 사용하는 원격 플랫폼에 액세스하는 경우 WebSphere MQ 메시지 큐를 참조하는 연관 요소에서 변환표를 지정하십시오.
- c
- 이 변수는 호출된 프로그램의 플랫폼에서 지원되는 문자 세트를
표시합니다. 다음 중 하나를 선택하십시오.
- Java의 경우 J(호출된 프로그램이 EGL 생성 Java 프로그램인 경우)
- EBCDIC의 경우 E(호출된 프로그램이 EGL 생성 COBOL 프로그램인 경우)
- x
- 이 변수는 원격 프로그램의 플랫폼에서 지정된 언어의 코드 페이지 번호를 표시합니다. 각 번호는 Character Data Representation Architecture Reference and Registry, SC09-2190에 지정되어 있습니다. 레지스트리는 변환표에서 지원하는 코딩 문자 세트를 식별합니다.
| 원격 플랫폼 | |||||
|---|---|---|---|---|---|
| 언어 | Linux | UNIX | Windows 2000/NT/XP | z/OS UNIX System Services 또는 iSeries Java | z/OS 또는 iSeries COBOL |
| 아랍어 | CSOJ1046 | CSOJ1046 | CSOJ1256 | CSOJ420 | CSOE420 |
| 중국어 | CSOJ1381 | CSOJ1381 | CSOJ1386 | CSOJ1388 | CSOE1388 |
| 대만어 | CSOJ950 | CSOJ950 | CSOJ950 | CSOJ1371 | CSOE1371 |
| 키릴어 | CSOJ866 | CSOJ866 | CSOJ1251 | CSOJ1025 | CSOE1025 |
| 덴마크어 | CSOJ850 | CSOJ850 | CSOJ850 | CSOJ277 | CSOE277 |
| 동부 유럽어 | CSOJ852 | CSOJ852 | CSOJ1250 | CSOJ870 | CSOE870 |
| 영어(영국) | CSOJ850 | CSOJ850 | CSOJ1252 | CSOJ285 | CSOE285 |
| 영어(미국) | CSOJ850 | CSOJ850 | CSOJ1252 | CSOJ037 | CSOE037 |
| 프랑스어 | CSOJ850 | CSOJ850 | CSOJ1252 | CSOJ297 | CSOE297 |
| 독일어 | CSOJ850 | CSOJ850 | CSOJ1252 | CSOJ273 | CSOE273 |
| 히브리어 | CSOJ856 | CSOJ856 | CSOJ1255 | CSOJ424 | CSOE424 |
| 일본어 | CSOJ943 | CSOJ943 | CSOJ943 | CSOJ1390(가타카나 SBCS), CSOJ1399(라틴어 SBCS) | CSOE1390(가타카나 SBCS), CSOE1399(라틴어 SBCS) |
| 한국어 | CSOJ1363 | CSOJ1363 | CSOJ1363 | CSOJ1364 | CSOE1364 |
| 포르투갈어 | CSOJ850 | CSOJ850 | CSOJ1252 | CSOJ037 | CSOE037 |
| 스페인어 | CSOJ850 | CSOJ850 | CSOJ1252 | CSOJ284 | CSOE284 |
| 스웨덴어 | CSOJ850 | CSOJ850 | CSOJ1252 | CSOJ278 | CSOE278 |
| 스위스 독일어 | CSOJ850 | CSOJ850 | CSOJ1252 | CSOJ500 | CSOE500 |
| 터키어 | CSOJ920 | CSOJ920 | CSOJ1254 | CSOJ1026 | CSOE1026 |
Java에서 프로그램을 호출할 때 연계 옵션 파트에서 변환표의 값을 지정하지 않은 경우 기본 변환표는 영어(미국)의 변환표입니다.
변환 알고리즘
레코드 및 구조의 데이터 변환은 하부구조가 없는 구조 필드의 선언에 기반합니다.
이름이 없는 변수(구조화된 레코드에서 별표로 표시됨) 또는 유형이 BIN, BIGINT, BOOLEAN, INT, SMALLINT, DECIMAL, MONEY, PACF, HEX, STRING 또는 UNICODE인 변수에 대해 변환이 수행되지 않습니다. 그러나 양방향 변환표를 사용하는 경우 표에 정의된 바와 같이 UNICODE 및 STRING 변수를 되돌립니다. 자세한 정보는 양방향 데이터 작업의 내용을 참조하십시오.
유형이 CHAR, DBCHAR 또는 MBCHAR인 데이터가 COBOL 또는 Java 변환표에 따라 변환됩니다.
유형이 FLOAT 및 SMALLFLOAT인 변수의 경우 변환 루틴이 Java에서 zSeries COBOL로 변환되고 Java의 경우 IEEE 754 형식과 zSeries COBOL의 경우 IBM® 370 형식을 사용하여 변환을 되돌립니다. Java와 iSeries COBOL 간 FLOAT 및 SMALLFLOAT 변수에는 변환이 필요하지 않습니다.
MBCHAR 데이터에 대한 EBCDIC에서 ASCII로의 변환 시 변환 루틴은 SO/SI(shift-out/shift-in) 문자를 삭제하고 변수의 끝에 동일한 수의 공백을 삽입합니다. ASCII에서 EBCDIC로의 변환 시 변환 루틴은 2바이트 문자열 주변에 SO/SI 문자를 삽입하고 필드에 적합한 마지막 유효 문자에서 값을 다릅니다. MBCHAR 필드가 가변 길이 레코드에 있고 현재 레코드 끝이 MBCHAR 필드에 있는 경우 SO/SI 문자의 삽입 또는 삭제를 반영하여 레코드 길이가 조정됩니다. 레코드 길이는 현재 레코드가 종료되는 위치를 표시합니다.
| 유형이 NUM인 경우 EBCDIC | 유형이 NUMC인 경우 EBCDIC | ASCII |
|---|---|---|
| F(양부호) | C | 3 |
| D(음부호) | D | 7 |
유형이 DATE, INTERVAL, TIME 또는 TIMESTAMP인 변수의 경우 EGL은 CHAR 알고리즘과 변수의 문자열 양식을 사용하여 값을 변환합니다.
sysLib.convert() 시스템 함수 및 sysVar.callConversionTable 시스템 변수에 대한 자세한 정보는 EGL 언어 참조서의 "convert()" 및 "callConversionTable" 주제에서 찾을 수 있습니다.