1. CALL
CALL statement는 프로그램 수행 중에 한 프로그램에서 다른 프로그램으로 프로그램의 제어를 변경시킬 때 사용한다. CALL statement를 사용하여 다른 프로그램을 호출하는 프로그램을 Calling program이라고 하고, Calling program에 의해서 호출되는 프로그램을 Called program이라고 한다.
Called program 역시 CALL statement를 사용하여 다른 프로그램을 호출할 수 있다. 직접 또는 간접적으로 자기 자신의 프로그램을 호출하기 위해서는 프로그램을 정의할 때 RECURSIVE로 정의된 경우에만 가능하다.
다음은 statement의 각 설정 항목에 대한 설명이다.
-
identifier-1, literal-1
-
identifier-1은 프로그램명을 지정할 수 있도록 alphanumeric, alphabetic 또는 numeric으로 선언되어 있어야 한다.
-
identifier-1은 windowed date field는 될 수 없다. literal-1의 경우에는 alphanumeric literal이어야 한다.
-
USAGE TYPE은 DISPLAY 타입이어야 한다.
-
Called program을 Procedure division의 처음부터 수행할 때에는 literal-1 또는 identifier-1의 데이터 값은 Called program의 Identification division에 정의한 프로그램명을 지정해야 한다.
만약, Procedure division의 처음이 아닌 Called program 내의 ENTRY statement로 지정된 특정 부분부터 수행하기 위해서는 ENTRY statement에서 선언한 이름을 지정해야 한다.
-
-
procedure-pointer-1 / function-pointer-1
-
유효한 Program entry point를 갖고있는 데이터 항목이어야 한다.
-
-
USING phrase
-
USING phrase는 Called program으로 전달할 인자를 지정한다. Called program의 Procedure division 또는 Entry statement의 인자의 개수와 USING phrase의 인자의 개수는 동일해야 하며, 인자의 순서대로 전달된다. USING phrase로 선언된 인자의 값은 Called program이 수행되는 동안에만 유효하다.
-
BY CONTENT, BY REFERENCE와 BY VALUE phrase는 다른 BY CONTENT, BY REFERENCE, BY VALUE가 나오기 전까지에만 적용된다. BY CONTENT, BY VALUE가 없을 경우에는 디폴트로 BY REFENCE로 선언되어 있는 것으로 처리한다.
-
-
BY REFERENCE phrase
-
BY REFERENCE phrase는 Calling program에서 데이터 항목의 copy data를 넘기는 것이 아니라, 데이터 항목의 주소값을 인자로 넘긴다. 따라서 Called program에서 Calling program으로 넘긴 인자의 값을 변경하게 되면 Called program이 종료된 후에도 값은 변경된 상태로 남아 있게 된다.
-
다음 항목을 설정한다.
항목 설명 identifier-2
Data division에서 정의된 어떤 레벨의 데이터 항목이라도 가능하다.
file-name-1
QSAM 파일에 대한 파일명이다.
ADDRESS OF identifier-2
identifier-2는 Linkage section에서 정의한 level-01이나 level-77의 데이터 항목이어야 한다.
OMITTED
데이터 항목을 인자로 넘기지 않는다는 것을 의미한다.
-
-
BY CONTENT phrase
-
BY CONTENT phrase는 Calling program에서 Called program으로 인자를 넘길 때 임시 장소에 값을 복사한 후 이 값을 넘긴다. 따라서 Called program에서는 인자의 데이터의 값을 변경하더라도 Calling Program의 데이터를 변경하는 것은 아니다.
-
다음 항목을 설정한다.
항목 설명 identifier-3
Data division에서 정의된 어떤 레벨의 데이터 항목이라도 가능하다.
literal-2
alphanumeric literal, Figurative constant, DBCS literal이 될 수 있다.
LENGTH OF special register
LENGTH OF 특수 레지스터에 대한 설명은 COBOL 워드의 특수 레지스터(Special Register)의 LENGTH OF를 참조한다.
ADDRESS of identifier-3
identifier-3은 Linkage section, Working-storage section, Local-storage section에서 정의한 level-66이나 level-88이 아닌 데이터 항목이어야 한다.
OMITTED
데이터 항목을 인자로 넘기지 않는다는 것을 의미한다.
-
-
BY VALUE phrase
-
BY VALUE phrase는 Calling program에서 Called program으로 데이터의 값 자체를 인자로 넘긴다. 따라서 Called program에서는 인자의 데이터의 값을 변경하더라도 Calling Program의 데이터를 변경할 수 없다.
-
초기에 BY VALUE phrase는 COBOL 프로그램과 Non-COBOL 언어(가령, C언어와 같은)와의 인터페이스를 위해서 도입되었지만 COBOL 프로그램과 COBOL 프로그램 사이에도 사용이 가능하다.
-
다음 항목을 설정한다.
항목 설명 identifier-4
Data Division에 정의된 그룹 항목이 아닌 데이터 항목이어야 한다.
다음 항목들이 가능하다.
-
Binary(USAGE BINARY, COMP, COMP-4, COMP-5)
-
Floating Point(USAGE COMP-1, COMP-2)
-
Function-pointer(USAGE FUNCTION-POINTER)
-
Pointer(USAGE POINTER)
-
Procedure-pointer(USAGE PROCEDURE-POINTER)
-
One single-byte alphanumeric character(such as PIC X or PIC A)
BY VALUE phrase가 사용될 경우 다음의 항목도 가능하다.
-
Reference-modifed item of usage display and length 1
-
SHIFT-IN and SHIFT-OUT special registers
-
LINAGE-COUNTER special register when it is usage binary
ADDRESS OF identifier-4
linkage-section이나 working-storage section, local-storage secion에서 선언한 level-66, level-88이 아닌 데이터 항목이어야 한다.
LENGTH OF special register
LENGTH OF 특수 레지스터가 사용되면, BY VALUE는 PIC 9(9) binary type으로 지정한다.
literal-3
다음 항목 중 하나이어야 한다.
-
A numeric literal
-
A Figurative constant ZERO
-
A one-character alphanemeric literal
-
A symbolic character
-
A single-byte Figurative constant(SPACE, QUOTE, HIGH-VALUE, LOW-VALUE)
다음의 규칙이 적용된다.
-
ZERO는 numeric value로 취급된다(fullword binary zero가 전송된다).
-
literal이 고정소숫점이면, 9자릿수 이하의 precesion을 가진다.
-
literal이 floating-point면, 8Bytes internal floating-point(COMP-2) 값이 전송된다.
-
-
-
RETURNING phrase
-
다음 항목을 설정한다.
항목 설명 identifier-5
identifier-5는 Data division에서 정의한 데이터 항목을 지정한다. Called program에서 지정한 리턴 값이 저장된다.
-
Called program을 COBOL이나 C 프로그램으로 작성한 경우 CALL statement의 RETURNING phrase를 지정할 수 있다. COBOL로 작성된 서브 프로그램을 호출하는 CALL statement에서 RETURNING phrase를 지정할 경우 다음의 내용을 주의해야 한다.
-
Called program은 Procedure division에 RETURNING phrase을 반드시 지정해야 한다.
-
Calling program의 RETURNING phrase에서 지정한 identifier-5와 Called program에서 지정한 RETURNING phrase는 PICTURE, USAGE, SIGN, SYNCHRONIZED, JUSTIFIED, BLANK WHEN ZERO clause가 동일해야 한다. (PICTURE clause의 경우 통화 기호는 상이할 수 있으며, 점과 콤마는 DECIMAL POINT IS COMMA clause에 따라 다를 수 있다)
-
Return된 value identifier-5이 USAGE INDEX, POINTER, FUNCTION-POINTER, PROCEDURE-POINTER 일경우 내부적으로 identifier-5 SET statement를 통해 변경한것처럼 작용한다.
-
Return된 value identifier-5이 그 외일경우, 내부적으로 identifier-5에 MOVE statement를 통해 변경한것처럼 작용한다.
-
EXCEPTION이나 OVERFLOW가 발생하면, identifier-5는 바뀌지 않는다. identifier-5는 referedce-modified되면 안된다.
-
RETURN-CODE는 RETURNING phrase가 있는 CALL statement가 살행될때에는 set되지 않는다.
-
-
-
ON EXCEPTION phrase
-
Called program을 수행하는 도중에 예외가 발생하게 될 경우 다음 중의 하나로 처리된다.
-
ON EXCEPTION phrase가 있는 경우에는 프로그램의 제어는 imperative-statement-1로 넘어간다.
-
CALL statement에 ON EXCEPTION phrase가 없는 경우 NOT ON EXCEPTION이 있더라도 무시한다.
-
-
-
NOT ON EXCEPTION phrase
-
Called program이 정상적으로 수행되었을 때에는 프로그램의 제어는 imperative-statement-2로 이동한다.
-
-
ON OVERFLOW phrase
-
ON OVERFLOW phrase는 ON EXCEPTION phrase와 동일한 역할을 수행한다.
-
-
END-CALL phrase
-
END-CALL phrase는 명시적으로 Call statement가 종료되었다는 것을 지정한다.
-