call

EGL call문은 제어를 기본 프로그램에서 호출된 프로그램으로 전송합니다. 호출된 프로그램은 종료될 때 제어를 기본 프로그램에 리턴합니다.

기본 프로그램은 선택적으로 매개변수를 호출된 매개변수에 전달합니다. 호출된 프로그램이 전달된 데이터를 변경하면 호출자가 사용 가능한 스토리지 영역도 변경됩니다. 기본 프로그램과 호출된 프로그램의 차이점에 대한 자세한 정보는 "프로그램 파트"를 참조하십시오.

프로그램 호출은 로컬이거나 원격일 수 있습니다. 로컬 호출의 정의는 플랫폼에 따라 다릅니다.
  • Java™의 경우 동일한 JVM에서 실행되는 생성된 Java pgm에 대한 호출
  • z/OS® Batch의 경우 동일한 시스템의 다른 COBOL pgm에 대한 호출
  • CICS®의 경우 동일한 리젼의 다른 COBOL pgm에 대한 호출

호출된 프로그램은 EGL에 의해 생성되거나 외부적으로 정의된 것으로 간주됩니다. 해당 프로그램이 외부적으로 정의되었음을 표시하는 방법에 대한 세부사항은 이 주제의 "구문" 절에 있는 isExternal 특성에 대한 설명을 참조하십시오.

call문에서 전달하는 숫자, 유형 및 인수 시퀀스는 호출된 프로그램이 예상하는 숫자, 유형 및 매개변수 시퀀스와 일치해야 합니다. 로컬 호출에서 전달할 수 있는 매개변수 수에는 제한이 없습니다. 원격 호출의 경우에는 전달할 수 있는 매개변수의 수 및 크기가 제한됩니다. 모든 원격 호출 구현에서는 결합된 매개변수 길이가 32,000바이트 미만인 30개 이상의 매개변수를 전달할 수 있습니다. 디자인에서 30개를 초과하는 매개변수가 필요하거나 호출당 32,000바이트를 초과하는 바이트를 전달해야 하는 경우에는 모든 필수 구현을 테스트하여 사용자가 전달해야 하는 데이터의 양을 지원하는지 확인하십시오.

다음과 같은 규칙이 리터럴 및 상수에 적용됩니다.
  • 전달된 리터럴 또는 상수의 크기는 수신하는 매개변수의 크기와 동일해야 함
  • 숫자 리터럴 또는 상수는 인수로 전달할 수 없음
  • 1바이트 문자만 포함하는 리터럴 또는 상수는 CHAR 또는 MBCHAR 유형의 매개변수에 전달할 수 있음
  • 2바이트 문자만 포함하는 리터럴 또는 상수는 DBCHAR 유형의 매개변수에만 전달할 수 있음
  • 1바이트 문자와 2바이트 문자의 조합을 포함하는 리터럴 또는 상수는 MBCHAR 유형의 매개변수에 전달할 수 있음

서비스 호출에 call문을 사용하는 것에 대한 추가적인 세부사항은 "서비스 액세스를 위한 call문 및 콜백 함수 코딩"을 참조하십시오.

VisualAge® Generator에서 마이그레이션된 프로그램을 호출하는 경우에는 VisualAge Generator 개발자가 일반적으로 고정 텍스트 변수 유형을 사용한다는 것을 기억하십시오. 리터럴로 유형을 지정하거나 textLiteralDefaultIsString 특성을 통해 문자 리터럴의 유형을 제어할 수 있습니다. textLiteralDefaultIsString 특성에 대한 자세한 정보는 textLiteralDefaultIsString의 내용을 참조하십시오. 리터럴에 대한 정보는 리터럴의 내용을 참조하십시오.

구문

call문에 대한 구문 다이어그램
programName
호출된 프로그램의 이름입니다. 이 프로그램은 EGL에 의해 생성되거나 외부적으로 정의된 것으로 간주됩니다. UNIX에 있거나 Java로 작성된 이름 등의 다수의 프로그램 이름은 대소문자를 구분합니다. EGL 디버거의 프로그램 이름은 대소문자를 구분하지 않습니다. 이름은 물음표나 물음표로 묶인 리터럴 문자열이나 변수 또는 상수 이름이 없는 직접 파트 참조일 수 있습니다.
argument
쉼표로 구분되는 일련의 값 참조 중 하나입니다. 인수는 기본 변수, 양식, 레코드, 기본 유형의 배열, 레코드의 배열, 숫자가 아닌 리터럴 또는 숫자가 아닌 상수일 수 있습니다. EGL이 생성 시 호출된 프로그램에 액세스할 수 있는 경우 인수는 더 복잡한 날짜/시간, 숫자 또는 텍스트 표현식일 수 있습니다. ANY, ArrayDictionary, BLOB, CLOB, DataTable 또는 사전 유형의 필드는 전달할 수 없습니다. 해당 유형의 배열 또는 해당 유형을 포함하는 레코드는 전달할 수 없습니다. 로컬 호출의 경우에는 인수의 수에 제한이 없습니다. 원격 호출에서는 30개 이하의 인수만 지원합니다.
properties
다음과 같은 특성이 지원됩니다.
isExternal
부울 특성입니다.
  • NO(기본값)는 연계 옵션 파트의 callLink 요소가 외부 프로그램이 호출 중인지 여부를 지정함을 나타냅니다. callLink 요소에 값을 배치하는 것이 더 유연합니다(설정이 코드에 임베드되지 않음).

    callLink 요소의 관련 속성은 pgmType(로컬 호출의 경우) 또는 remotePgmType(원격 또는 EJB 호출의 경우)입니다.

  • YES는 비EGL 생성 프로그램이 호출 중임을 나타냅니다.
isNoRefresh
호출자가 텍스트 양식을 제공하고 다음 상황 중 하나가 적용되는 경우에만 의미를 가지는 부울 특성입니다.
  • 호출된 프로그램이 텍스트 양식을 제공하지 않습니다.
  • 호출자가 호출 후 전체 화면 텍스트 양식을 작성합니다.

이 특성은 두 개의 값을 가지고 있습니다.

  • NO(기본값)는 연계 옵션 파트의 callLink 요소가 화면 새로 고치기가 방지되는지 여부를 지정함을 나타냅니다. callLink 요소(특히 refreshScreen 속성)에서 값을 설정하는 것이 더 유연합니다(의사결정이 코드에 임베드되지 않음).
  • YES는 호출된 프로그램이 제어를 리턴할 때 화면 새로 고치기가 방지됨을 나타냅니다.
linkageKey
연계 옵션 파트의 callLink 요소를 참조하는 문자열입니다. 이 문자열은 해당 요소의 pgm 속성과 일치합니다. 자세한 내용은 "linkageKey"를 참조하십시오.
timeout
서비스 호출과 응답 사이에 경과하는 최대 유효 시간(밀리초)을 나타내는 정수입니다. call문의 경우 이 특성은 값이 웹 서버의 EGL Rich UI 프록시가 서비스를 호출할 때와 이 프록시가 응답을 수신할 때 사이의 최대 시간(밀리초)인 Rich UI 애플리케이션만을 위한 것입니다. 자세한 내용은 "서비스 액세스를 위한 call문 및 콜백 함수 코딩"을 참조하십시오.

올바른 호출

다음 표에서는 EGL 생성 코드에 대해 올바른 호출을 보여줍니다.

표 1. EGL의 올바른 호출
호출하는 오브젝트 호출된 오브젝트
J2EE 외부에 있는 Java 클래스의 EGL 생성 Java 랩퍼 EGL 생성 Java 프로그램(비J2EE)
J2EE 애플리케이션 클라이언트의 EGL 생성 Java 프로그램
EGL 생성 EJB 세션 Bean
IMS/VS 프로그램(EGL에 의해 생성되거나 생성되지 않음)
IMS™ 트랜잭션
CICS 프로그램(EGL에 의해 생성되거나 생성되지 않음)
J2EE 애플리케이션 클라이언트의 EGL 생성 Java 랩퍼 EGL 생성 Java 프로그램(비J2EE)
J2EE 애플리케이션 클라이언트의 EGL 생성 Java 프로그램
EGL 생성 EJB 세션 Bean
IMS/VS 프로그램(EGL에 의해 생성되거나 생성되지 않음)
IMS 트랜잭션
CICS 프로그램(EGL에 의해 생성되거나 생성되지 않음)
J2EE 웹 애플리케이션의 EGL 생성 Java 랩퍼 EGL 생성 Java 프로그램(비J2EE)
J2EE 애플리케이션 클라이언트의 EGL 생성 Java 프로그램
동일한 J2EE 웹 애플리케이션의 EGL 생성 Java 프로그램
EGL 생성 EJB 세션 Bean
IMS/VS 프로그램(EGL에 의해 생성되거나 생성되지 않음)
IMS 트랜잭션
CICS 프로그램(EGL에 의해 생성되거나 생성되지 않음)
J2EE 외부의 EGL 생성 Java 프로그램 EGL Java 프로그램(비J2EE)
J2EE 애플리케이션 클라이언트의 EGL Java 프로그램
EGL EJB 세션 Bean
IBM® i의 Java 프로그램
IBM i의 COBOL 프로그램
C 또는 C++로 작성된 비EGL 프로그램
IMS/VS 프로그램(EGL에 의해 생성되거나 생성되지 않음)
IMS 트랜잭션
CICS 프로그램(EGL에 의해 생성되거나 생성되지 않음)
J2EE 애플리케이션 클라이언트의 EGL Java 프로그램 EGL Java 프로그램(비J2EE)
J2EE 애플리케이션 클라이언트의 EGL Java 프로그램
EGL EJB 세션 Bean
IBM i의 Java 프로그램
IBM i의 COBOL 프로그램
C 또는 C++로 작성된 비EGL 프로그램
IMS/VS 프로그램(EGL에 의해 생성되거나 생성되지 않음)
IMS 트랜잭션
CICS 프로그램(EGL에 의해 생성되거나 생성되지 않음)
J2EE 웹 애플리케이션의 EGL Java 프로그램 EGL Java 프로그램(비J2EE)
J2EE 애플리케이션 클라이언트의 EGL Java 프로그램
동일한 J2EE 웹 애플리케이션의 EGL Java 프로그램
IBM i의 Java 프로그램
IBM i의 COBOL 프로그램
C 또는 C++로 작성된 비생성 프로그램
CICS 프로그램(EGL에 의해 생성되거나 생성되지 않음)
EGL EJB 세션 Bean EGL Java 프로그램(비J2EE)
J2EE 애플리케이션 클라이언트의 EGL Java 프로그램
EGL EJB 세션 Bean
C 또는 C++로 작성된 비생성 프로그램
CICS 프로그램(EGL에 의해 생성되거나 생성되지 않음)
EGL CICS 프로그램 CICS 프로그램(EGL에 의해 생성되거나 생성되지 않음)
EGL z/OS Batch 프로그램
EGL z/OS Batch 프로그램 모든 언어(EGL 포함)로 작성되어 z/OS(CICS 또는 IMS의 외부)에서 실행되는 일괄처리 프로그램
비EGL CICS 프로그램 CICS COBOL 프로그램(EGL에 의해 생성되거나 생성되지 않음)
모든 언어(EGL 포함)로 작성되어 z/OS(CICS 또는 IMS의 외부)에서 실행되는 일괄처리 프로그램
IBM i의 EGL COBOL 프로그램 IBM i의 EGL COBOL 프로그램
모든 언어로 작성되어 IBM i에서 실행되는 비EGL 프로그램
모든 언어로 작성되어 IBM i에서 실행되는 비EGL 프로그램 IBM i의 EGL COBOL 프로그램
모든 언어로 작성되어 IBM i에서 실행되는 비EGL 프로그램

비EGL 생성 Java 코드에서 EGL 생성 Java 코드를 호출하려면 EGL 외부 유형 또는 Java 액세스 함수를 사용하십시오.

예제

다음 예제에서는 대출의 이자를 계산하는 호출된 프로그램을 보여줍니다.

  if (userRequest == "C")
    try
      call programA(myCustomer, interestRate);
    onException(myEx InvocationException)
      myErrorHandler(12);
    end  end

오류 조건

각각의 인수에 전달되는 바이트 수는 수신하는 매개변수가 예상하는 바이트 수와 동일해야 합니다. 자세한 정보는 "호환성"을 참조하십시오.

원격으로 호출된 프로그램의 예외는 호출하는 프로그램에 직접 전파되지 않습니다. 대신 InvocationException에 의해 랩핑됩니다. 원격으로 호출된 프로그램이 예외를 처리하지 않으면 호출된 프로그램이 종료되고 호출자에게 InvocationException이 발생합니다.

호환성

표 2. call문에 대한 호환성 고려사항
플랫폼 문제
Java 생성
  • 길이 불일치의 런타임 정정으로 인해 유형 불일치가 발생하는 경우에만 길이 불일치로 인해 오류가 발생합니다.
    • 호출된 프로그램이 지나치게 적은 바이트를 수신하는 경우에는 전달된 데이터의 끝 부분이 공백으로 채워집니다.
    • 호출된 프로그램이 지나치게 많은 바이트를 수신하는 경우에는 전달된 데이터의 끝 부분이 잘립니다.
    예를 들어, NUM 유형의 변수에 공백이 추가된 경우 호출된 프로그램이 해당 변수의 데이터 사용을 시도하면 EGL에는 RuntimeException이 발생합니다. CHAR 유형의 변수에 공백이 추가된 경우에는 예외가 발생하지 않습니다.
  • call문 또는 서비스 함수 호출에서 인수로 전달되는 SMALLFLOAT 및 FLOAT 변수의 경우 remoteComType이 CICSECI, CICSJ2C, CICSSSL, IMSJ2C 또는 IMSTCP이면 Java 런타임에서는 IBM 370 형식을 사용합니다. 기타 유형의 호출 또는 함수 호출에 대한 데이터를 변환할 때는 Java 런타임에서 IEEE 형식을 사용합니다.
COBOL 생성 순환 프로그램 호출은 zSeries의 경우에만 허용됩니다. 이 지원은 순환을 허용하는 COBOL에 따라 다릅니다. 이는 CICS에서는 일반적으로 문제가 되지 않지만 일괄처리 모드에서는 문제가 될 수 있습니다. 순환 호출은 기호 매개변수 ALLOWRECURSIVEPROGRAMS를 YES로 설정하여 사용으로 설정해야 합니다. 자세한 정보는 사용자가 설정할 수 있는 사전정의된 기호 매개변수를 참조하십시오.
CICS 각각의 인수에 전달되는 바이트 수가 CICS 프로그램이 예상하는 바이트 수와 동일하지 않으면 런타임 이상 종료가 발생합니다.
Rich UI call문의 한 버전이 지원되지만 서비스 호출을 위해서만 지원됩니다. 세부사항은 "서비스 액세스를 위한 call문 및 콜백 함수 코딩"을 참조하십시오.
참고: Windows 기반 Java 랩퍼 프로그램에서 32,500바이트를 초과하는 데이터가 포함된 레코드를 AS400 V7R2 기반의 EGL로 생성된 COBOL 프로그램으로 전송하는 경우 EGL0147E 또는 EGL0149E 오류와 함께 프로그램이 실패합니다.
클라이언트와 서버 사이에서 32,500바이트의 제한 없이 레코드를 전달하려면 다음 단계를 수행하십시오.
  1. 연계 파일 설정을 remotePgmType=EXTERNALLYDEFINED로 변경하십시오.
  2. QEGL의 QVGNRNCL 멤버를 사용자 라이브러리에 복사하십시오.