Procedure division

본 장에서는 Procedure division 구조와 각 statement의 사용법에 대해서 설명한다.

1. Procedure division 구조

다음은 Procedure division의 기본 구조이다.

figure procedure division
Procedure division
figure sect
Procedure division : section
figure para
Procedure division : paragraph

Procedure division은 다음의 요소들로 구성된다.

  • Header

  • Declaratives

  • Procedures

  • Arithmetic expressions

  • Conditional expressions

  • Statement categories

  • Statement operations

1.1. Header

Procedure division의 Header는 다음 그림과 같이 USING paragraph, RETURNING paragraph로 구성된다.

figure pd program procedure division header
Program Procedure division Header Format

다음은 각 설정 항목에 대한 설명이다.

  • USING paragraph

    • USING paragraph는 프로그램이 호출되었을 때 호출한 프로그램으로부터 파라미터를 전달받기 위해 지정한다.

    • USING을 통해 데이터를 전달받기 위해서는 프로그램의 linkage section에 전달받을 데이터 항목에 대해 01 혹은 77level 아이템으로 기술해야 한다. 반면 CALL을 사용해서 서브 프로그램에 데이터를 전달하기 위해서는 호출한 프로그램의 Data division에 전달할 파라미터의 데이터 항목을 기술해야 한다.

      linkage section에 지정된 항목은 다음의 조건을 만족해야만 참조가 가능하다.

      • USAGE paragraph에 지정된 오퍼랜드

      • SET ADDRESS OF, CALL ... BY REFERENCE ADDRESS OF의 오퍼랜드

      • 위의 조건을 만족하면서 REDEFINES 또는 RENAMES가 정의된 오퍼랜드

      • 위의 조건을 만족하는 서브 항목

      • 위의 조건을 만족하는 condition-name이나 index-name

    • USING을 통해 Non-COBOL 프로그램에서 COBOL 프로그램으로 데이터를 전달받을 수 있으며, 반대로 COBOL 프로그램에서 Non-COBOL로 데이터를 전달할 수 있다.

    • 호출하는 프로그램에서 전달하는 파라미터와 호출되는 프로그램에서 전달 받는 파라미터 간의 대응 관계는 지정한 파라미터의 이름에 의해 결정되는 것이 아니라 위치에 의해 결정된다. 호출하는 프로그램과 호출되는 프로그램에서 대응되는 identifier는 Data description은 동일할 필요는 없지만 바이트 수는 동일해야 한다.

    • 파라미터의 전달 방식에는 BY REFERENCE(참조에 의한) 방식과 BY VALUE(값에 의한)방식이 있다. 파라미터 전달 방식에 대한 자세한 내용은 CALL을 참조한다.

  • RETURNING paragraph

    • RETURNING paragraph는 호출한 프로그램에게 값을 전달하기 위해 지정한다.

    • data-name2는 프로그램의 linkage section에 01/77level로 기술되어 있어야 한다.

    • RETURNING 데이터 항목은 출력 전용 데이터 항목이다. 프로그램 초기상태에서 이 데이터 항목의 값은 예상할 수 없다. 따라서 이 데이터 항목을 참조하기 전에 반드시 초기화를 해야 한다. RETURNING paragraph에 대한 자세한 내용은 CALL을 참조한다.

1.2. Declaratives

Declaratives section는 프로그램 실행 도중에 예외 조건이 발생했을 때 실행할 액션을 기술한다.

Declaratives section은 Procedure division의 처음에 기술되어야 하며 모든 procedure는 section으로 나뉘어져야 한다. 각각의 Declaratives section은 USE statement으로 시작되며 다음에는 예외 조건이 발생했을 때 실행되는 액션을 기술한다.

모든 Declarative section은 DECLARATIVE와 END DECLARATIVCE 구문 안에 기술해야 한다.

명시적으로 END DECLARATIVCES를 지정하거나 또 다른 Declarative section의 시작인 USE statement이 있으면 해당 Declarative section의 마지막을 의미한다. USE statement 자체는 실행되지 않는다. 대신 예외 상황이 발생했을 때 실행될 액션과 예외 조건을 정의한다. 예외 조건이 발생해서 procedure가 수행되고 나면 콘트롤은 예외 조건을 발생시킨 루틴으로 돌아간다.

다음은 Declarative procedure 수행 규칙이다.

  • Declarative procedure는 nondeclaraive procedure로부터 실행되어질 수 있다.

  • Nondeclarative procedure는 Declarative procedure로부터 실행되어질 수 있다.

  • Declarative procedure는 Declarative procedure 안에 기술된 GO TO statement에서 참조될 수 있다.

  • Nondeclarative procedure는 Declarative procedure 안에 기술된 GO TO statement에서 참조될 수 있다.

1.3. Procedures

Procedure division 내에 procedure는 section이나 section group 또는 paragraph이나 paragraph group으로 구성되어 있다. procedure-name은 section이나 paragraph을 식별하기 위한 사용자 이름이다.

  • section

    section은 section-header, section-name, priority-number, 점(.)로 구성된다.

    항목 설명

    section-header

    section-header는 section-name, SECTION, priority-number, 점 순으로 구성되어 있으며, 생략이 가능하다. section-header는 END DECLARATIVES 다음이나 declarative가 없는 경우에 사용 가능하다.

    section-name

    section을 식별하기 위한 사용자 정의어로 Procedure division 내에서는 유일해야 한다.

    priority-number

    0 ~ 99까지의 숫자로 프로그램 동작에는 영향을 주지 않는다. 고정된 단위의 segment 혹은 segment가 포함된 section을 의미한다. declaratives의 section은 0부터 49까지의 number를 가진다.

  • paragraph

    paragraph은 paragraph-name, 점(.), 문장들(sentences)로 구성된다. 여러 개의 단락들은 반드시 점으로 분리되어야 한다.

    항목 설명

    paragraph-name

    단락을 식별하기 위한 사용자 정의어로 qualifier가 가능하다.

    Sentence

    문장은 점으로 분리된 한 개 또는 여러 개의 구문들로 구성된다.

    • 구문(statement)

      • 구문은 COBOL 동사로 시작되며 다음에 문법적으로 유효한 식별자(identifier), 문자열, 연산자 등으로 구성된다.

      • 프로그램의 실행은 Procedure division에 처음에 기술된 구문부터 차례대로 실행된다.

      • 중첩된 프로그램의 시작을 의미하는 Identificaiton division의 바로 이전, END PROGRAM 또는 파일의 마지막이 해당 Procedure division의 끝을 의미한다.

1.4. Arithmetic expressions

연산식(Arithmetic expression)은 조건 구문이나 연산 구문의 오퍼랜드로 사용되어지는 표현식을 의미하며 연산식에는 다음과 같은 종류가 있다.

  • Numeric elementary item 식별자

  • 상수 문자

  • Figurative constant ZERO

  • 식별자, 연산 기호, 상수 문자로 이루어진 연산식

  • 연산식, 연산 기호 연산식으로 이루어진 연산식

  • 소괄호로 묶여 있는 연산식

단항 연산자(unary arithmetic operator)는 연산식 앞에 기술할 수 있다. 연산식에 기술한 식별자와 문자는 Numeric elementary item 또는 상수 문자로 연산이 가능해야 한다.

지수 연산식(exponential expression)의 결과값으로 양수와 음수가 존재할 때는 그 결과 값으로 양의 정수 값을 취한다. 밑수가 0인 경우는 멱수는 0보다 커야 한다. 그렇지 않으면 size error조건이 발생하게 된다.

Arithmetic operator

연산자는 이항 연산자와 단항 연산자가 있다. 각각의 연산자의 의미는 다음의 표와 같다.

  • 이항 연산자

    연산자 의미

    +

    덧셈

    -

    뺄셈

    *

    곱셈

    /

    나눗셈

    **

    거듭제곱

  • 단항 연산자

    연산자 의미

    +

    +1을 곱함

    -

    -1을 곱함

연산식에 대한 연산순서는 일반적으로 왼쪽에서 오른쪽의 순서로 계산되며, 괄호가 있는 경우는 가장 안쪽에 있는 괄호 안의 연산식이 우선된다.

연산자들의 우선순위는 다음과 같다.

  1. 단항 연산자

  2. 거듭제곱

  3. 곱셈과 나눗셈 연산자(곱셈과 나눗셈 연산자는 우선순위는 없으며, 왼쪽에서 오른쪽으로 순차적으로 연산이 실행된다.)

  4. 덧셈과 뺄셈 연산자(덧셈과 뺄셈 연산자는 우선순위는 없으며, 왼쪽에서 오른쪽으로 순차적으로 연산이 실행된다.)

연산식의 시작은 단항 연산자, 왼쪽 괄호 '(', 오퍼랜드로 시작되어야 하며, 오른쪽 괄호 ')'나 오퍼랜드로 끝나야 한다. 한 개의 식별자 또는 문자로 구성되어진 연산식도 가능하다. 연산식에서 왼쪽 괄호와 오른쪽 괄호는 쌍이 맞아야 한다.

다음은 연산 기호사이의 유효한 조합을 나타내는 표로써 가장 왼쪽에 있는 컬럼은 첫 번째 기술되는 연산자 또는 오퍼랜드를 의미하며 첫 번째 열은 그 다음에 기술되는 연산자 또는 오퍼랜드를 의미한다.

식별자 또는 문자상수 * / ** + - 단항 연산자 (+, -) 왼쪽 괄호 ( 오른쪽 괄호 )

식별자 또는 문자상수

* / ** + -

단항 연산자 + -

여는 괄호 (

닫는 괄호 )

1.5. Conditional expressions

Conditional expression은 참값에 대한 판별에 의해 프로그램에서 선택적으로 실행 로직을 변경할 수 있도록 한다. Conditional expression은 EVALUATE, IF, PERFORM 그리고 SEARCH statement에 사용될 수 있다.

Conditional expression은 다음의 2가지로 나눌 수 있다.

  • Simple conditions

  • Complex conditions

1.5.1. Simple conditions

Simple condition은 참 또는 거짓의 값을 가진다.

Simple conditions은 다음 4 종류가 있다.

  • Class condition

  • Condition-name condition

  • Relation condition

    Relation condition은 2개의 오퍼랜드를 비교한다. 비교는 다음으로 정의된다.

    • 두 개의 Alphabetic class operands

    • 두 개의 Alphanumeric class operands

    • 두 개의 DBCS class operands

    • 두 개의 Numeric class operands

    • Alphabetic class operand와 alphanumeric class operand

    • Numeric integer operand와 alphanumeric class operand

    • Index 또는 index data item의 비교

    • 두 개의 data pointer operands

    • 두 개의 procedure pointer operands

    • 두 개의 function pointer operands

    • Alphanumeric group과 DISPLAY 또는 DISPLAY-1 usage를 가지는 operand

    Relation condition에는 다음의 2가지 종류가 있다.

    • General relation conditions

    • Data pointer Relation conditions

  • Sign condition

  • Switch-status condition

Class conditions

데이터 항목의 내용이 alphabetic, alphabetic-lower, alphabetic-upper, numeric, DBCS, KANJI인지 또는 environment division의 SPECIAL-NAMES paragraph에 정의된 CLASS clause에 기술된 문자를 포함하는지를 판별한다.

figure pd class condition
Class conditions Format
  • identifier-1

    • 다음에 기술된 USAGE를 가진 데이터 항목을 참조해야 한다.

      • NUMERIC이 기술된 경우 : DISPLAY, COMPUTATIONAL-3, PACKED-DECIMAL

      • DBCS가 기술된 경우 : DISPLAY-1

      • ALPHABETIC, ALPHABETIC-UPPER 또는 ALPHABETIC-LOWER가 기술되었을 때 : DISPLAY

      • Class-name이 기술된 경우 : DISPLAY

    • identifier-1이 function-identifier이면 반드시 alphanumeric function을 참조해야 한다.

    • 다음 중에 하나를 설정한다.

      항목 설명

      NOT

      참값의 판별을 반대로 한다.

      예를 들면 NOT NUMERIC은 NUMERIC class 판별이 거짓일 때 결과가 참이 된다.

      NUMERIC

      identifier-1이 모두 0 ~ 9의 숫자로 구성되어 있다.

      ALPHABETIC

      identifier-1은 대소문자 구분없이 알파벳 문자 A ~ Z와 공백 문자로 구성되어 있다.

      ALPHABETIC-LOWER

      identifier-1은 소문자 알파벳 a ~ z와 공백 문자로 구성되어 있다.

      ALPHABETIC-UPPER

      identifier-1은 대문자 알파벳 A ~ Z와 공백 문자로 구성되어 있다.

      class-name

      identifier-1은 SPECIAL-NAMES paragraph class-name에 정의된 문자들로 구성되어 있다.

      DBCS

      identifier-1은 DBCS 문자들로 구성되어 있다.

아래 표는 사용 가능한 데이터 항목의 타입과 class condition 사이의 관계를 보여 준다.

Type of data item Reference by identifier-1 Valid forms of the class condition

Alphabetic

ALPHABETIC

ALPHABETIC-LOWER

ALPHABETIC-UPPER

class-name

NOT ALPHABETIC

NOT ALPHABETIC-LOWER

NOT ALPHABETIC-UPPER

NOT class-name

Alphabetic,

Alphabetic-edited,

Numeric-edited

ALPHABETIC

ALPHABETIC-LOWER

ALPHABETIC-UPPER

NUMERIC

class-name

NOT ALPHABETIC

NOT ALPHABETIC-LOWER

NOT ALPHABETIC-UPPER

NOT NUMERIC

NOT class-name

External-decimal,

Internal-decimal

NUMERIC

NOT NUMERIC

DBCS

DBCS

NOT DBCS

Numeric

NUMERIC

class name

NOT NUMERIC

NOT class name

Condition-name conditions

Condition-name은 conditional variable을 검사하여 그 값이 연관된 condition-name의 어떠한 값과 같은지를 판별한다.

figure pd condition name condition
condition-name format
항목 설명

condition-name-1

Relation condition을 약식으로 사용할 때 사용된다. Conditional variable과 condition-name 값과의 비교 규칙은 Relation condition의 규칙과 동일하다.

condition-name-1이 범위를 가진 값이라면, conditional variable은 그 값이 범위에 포함되는지를 판별하여 검사된다. conditional variable의 값이 conditon-name의 값들 중 하나와 같다면 결과는 참이된다.

다음 예제는 conditional variables와 condition-name의 사용법을 보여준다.

01 AGE-GROUP PIC 99.
 88 INFANT VALUE 0.
 88 BABY VALUE 1, 2.
 88 CHILD VALUE 3 THRU 12.
 88 TEENAGER VALUE 13 THRU 19.

AGE-GROUP은 conditional variable이다. INFANT, BABY, CHILD와 TEENAGER는 condition-name이다.

다음의 IF문은 AGE-GROUP의 값을 바탕으로 age group을 결정한다.

IF INFANT... (Tests for value 0)
IF BABY... (Tests for values 1, 2)
IF CHILD... (Tests for values 3 through 12)
IF TEENAGER... (Tests for values 13 through 19)
General relation conditions

General relation condition은 두 개의 오퍼랜드를 비교한다. 오퍼랜드는 identifier, literal, arithmetic expression 또는 index-name이 될 수 있다.

figure pd general relation
General relation condition format
항목 설명

operand-1

Relation condition의 subject이다. Identifier, literal, function-identifier, arithmetic expression 또는 index-name이 될 수 있다.

operand-2

Relation condition의 object이다. Identifier, literal, function-identifier, arithmetic expression 또는 index-name이 될 수 있다.

General Relation condition에서 데이터 항목, 리터럴 그리고 Figurative constants는 다음의 비교 형태에 따라 비교된다.

비교 형태 설명

Alphanumeric

두 오퍼랜드의 Alphanumeric 문자 비교

DBCS

두 오퍼랜드의 DBCS 문자 비교

Numeric

두 오퍼랜드의 대수적인 값 비교

GROUP

한쪽이 Alphanumeric 그룹 항목일 때 두 오퍼랜드의 Alphanumeric 문자 비교

(Int)

정수형 item만 비교(Alph, Num, Group와 같이 사용)

Blank

비교될 수 없음

다음 표들은 다른 종류의 오퍼랜드에 대한 가능한 비교의 짝을 보여준다.

figure pd table24 1
Comparisons involving data items and literals
figure pd table25
general relateion condition format
  • Alphanumeric comparisons

    • 두 오퍼랜드의 single-byte character 비교를 수행한다. 비교는 collating sequence에 정의된 순서에따라 수행된다.

    • 두 오퍼랜드 중 하나가 alphanumeric 혹은 alphabetic이 아닐 경우, 다음의 과정이 수행된다.

      1. Zoned decimal integer operand는 같은 사이즈의 Zoned decimal alphanumeric 아이템으로 취급된다.

      2. display floating-point 아이템은 numeric value가 아니라 alphanumeric 아이템으로 취급된다.

    • 두 오퍼랜드의 size가 같으면, leftmost character에서 rightmost까지 비교해가며, 최초의 서로다른 character가 발견되었을때, 그 character의 collating sequence를 비교하여 우선순위를 정한다.

    • 두 operand의 size가 다르면, 짧은쪽의 operand에 space를 긴 쪽의 오퍼랜드의 size만큼 붙이고, comparision을 진행한다.

  • DBCS comparisions

    Alphanumeric comparision과 비교 과정이 동일하다. binary hexadecimal collating sequence를 사용한다.

  • Numeric comparisions

    두 오퍼랜드의 대수 비교를 수행한다.

  • Group comparisions

    두 오퍼랜드의 Alphanumeric character comparision을 수행한다. Alphanumeric elementary data item 비교와 동일한 취급을 한다.

  • Index comparisions

    두 인덱스 아이템의 비교는 인덱스 아이템이 갖고있는 occurrence number의 비교를 수행하는 것이다. 인덱스와 데이터 항목 또는 literal을 비교한다면 occurrence number와 data, literal 값을 비교하게 된다.

Data pointer Relation conditions

Pointer 데이터 항목에 대해서는 오직 같은지 다른지에 대해서만 비교할 수 있다. Pointer 데이터 항목은 USAGE POINTER로 정의된 데이터 항목이거나 ADDRESS OF 특수 레지스터이다.

Relation condition인 IF, PERFORM, EVALUATE와 SEARCH (format-1) statement에 사용될 수 있다. SEARCH format-2(SEARCH ALL)에는 사용하지 말아야 한다.

figure pd data pointer relation
Data pointer Relation condition Format
항목 설명

identifier-1, identifier-3

level-66, level-88을 제외한 어떠한 데이터 항목도 사용 가능하다.

identifier-2, identifier-4

USAGE POINTER로 정의된 데이터 항목이다.

NULL, NULLS

NULL pointer이다.

Procedure-pointer and function-pointer Relation conditions

같은지, 같지 않은지에 대해 비교만 가능하다.

figure pd procedure function pointer relation
Procedure-pointer and function-pointer relation conditions Format
항목 설명

identifier-1, identifier-3

USAGE PROCEDURE-POINTER 또는 FUNCTION-POINTER여야 한다.

NULL, NULLS

NULL pointer이다.

Sign conditions

Sign condition은 Numeric 오퍼랜드의 값이 0보다 큰지, 작은지, 같은지를 판별한다.

figure pd sign condition
sign condition Format
항목 설명

operand-1

Numeric identifier 또는 Arithmetic expression이어야 한다.

0보다 크면 POSITIVE, 0보다 작으면 NEGATIVE, 0과 같으면 ZERO가 된다.

부호 없는 오퍼랜드는 POSITIVE 또는 ZERO가 될 수 있다.

NOT

참, 거짓의 판별을 바꾼다. 예를 들어 NOT ZERO는 오퍼랜드가 0이 아닌 양수나 음수값을 가질 때 참이 된다.

Switch-status conditions

switch status condition은 UPSI siwitch의 ON 혹은 OFF 상태를 정의한다. UPSI switch의 value 상태에 따라 결과가 결정된다.

figure pd switch condition
Switch-status condition Format
항목 설명

condition-name

special-names paragraph에 정의된 UPSI switch이다.

1.5.2. Complex conditions

Complex condition은 logical operator를 사용한 simple conditions, combined conditions의 결합이나 logical negation을 사용한 condition의 negating 등으로 만들어진다. 각각의 logical operator은 앞뒤로 공백 문자가 있어야 한다.

괄호를 사용하지 않는다면 다음 순서에 따라 우선순위가 정해진다.

  1. Arithmetic operator

  2. Simple conditions

  3. NOT

  4. AND

  5. OR

Complex condition의 참값은 각각의 simple condition의 참값과 logical operator와의 상호 관계에 따라 판별된다. Complex condition은 다음이 될 수 있다.

  • Negated simple condition

  • Combined conditon(Negated 될 수 있다.)

Nagated simple conditions

Simple conditons은 logical operator NOT을 사용하여 참, 거짓 값을 바꿀 수 있다.

figure pd negated simple conditions
Nagated simple conditions Format
항목 설명

conditions-1

conditions-1의 참, 거짓 판별에 대해 반대의 결과를 내놓는다.

conditions-1이 참이면 전체 결과는 거짓이되고, condition-1 결과가 거짓이면 전체 결과는 참이 된다.

condition-1이 괄호로 묶여 있어도 결과는 같다. 예를 들면 다음 두 문장은 동일하다.

NOT A IS EQUAL TO B
NOT ( A IS EQUAL TO B )
Combined conditions

2개 이상의 conditions들이 logical operator로 연결되어 Combined condition을 만든다.

figure pd combined conditions
Combined condition Format

다음에 열거된 것들이 condition-1이나 condition-2에 올 수 있다.

  • Simple condition

  • Nagated simple condition

  • Combined conditon

  • Nagated combined condition(logical operator NOT 다음에 괄호로 묶여진 combined condition이 오는 경우)

다음 표는 logical operator와 condition C1, C2의 관계이다.

Value for C1 Value for C2 C1 AND C2 C1 OR C2 NOT (C1 AND C2) NOT C1 AND C2 NOT (C1 OR C2) NOT C1 OR C2

True

True

True

True

False

False

False

True

False

True

False

True

True

True

False

True

True

False

False

True

True

False

False

False

False

False

False

False

True

False

True

True

Abbreviated combined Relation conditions

Relation conditions가 연속적으로 쓰여질 때 첫 번째 Relation condition 후의 Relation condition은 다음 2가지 방법 중 하나로 축약될 수 있다.

  • Subjecet의 생략

  • Subjecet와 Relation operator의 생략

figure pd abbreviated combined relation conditions
Abbreviated combined Relation condition Format

연관되는 relation conditon에서 두 가지 형태로 축약될 수 있다. Abbreviated condition은 다음처럼 판별된다.

  • 마지막에 기술된 subject가 생략된 subject이다.

  • 마지막에 기술된 relation operator가 생략된 operator이다.

다음 표는 축약된 condition의 예이다.

Abbreviated combined relation condition Equivalent

A = B AND NOT < C OR D

((A = B) AND (A NOT < C)) OR (A NOT < D)

A NOT > B OR C

(A NOT > B) OR (A NOT > C)

NOT A = B OR C

(NOT (A = B)) OR (A = C)

NOT (A = B OR < C)

NOT ((A = B) OR (A < C))

NOT (A NOT = B AND C AND NOT D)

NOT ((((A NOT = B) AND (A NOT = C)) AND (NOT (A NOT = D))))

1.6. Statement categories

본 절에서는 Statement categories의 구성 요소에 대해서 설명한다.

1.6.1. Imperative statements

비조건 구문(Imperative statement)은 프로그램에 의해 무조건적으로 실행되는 구문 또는 END-ADD, END-DIVIDE와 같이 명시적으로 구문의 끝을 나타내는 phrases로 구분되는 조건 구문을 의미한다. 비조건 구문은 해당 구문이 허용되는 곳이면 어떤 곳이든 기술할 수 있다.

COBOL에서 비조건 구문은 다음과 같은 것이 있다.

항목 설명

Arithmetic

  • ADD

  • COMPUTE

  • DIVIDE

  • MUTIPLY

  • SUBTRACT

ON SIZE ERROR나 NOT ON SIZE ERROR phrase가 지정되어 있지 않은 경우

Data movement

  • ACCEPT

  • INITIALIZE

  • INSPECT

  • MOVE

  • SET

  • STRING(*)

  • UNSTRING(*)

[참고]

(*) : ON OVERFLOW나 NOT ON OVERFLOW phrase가 지정되어 있지 않은 경우

Ending

  • STOP RUN

  • EXIT PARAGRAPH

  • EXIT PROGRAM

  • GO BACK

Input-output

  • ACCEPT

  • CLOSE

  • DELETE(*)

  • DISPLAY

  • OPEN

  • READ(+)

  • REWRITE(*)

  • START(*)

  • STOP

  • WRITE(-)

[참고]

(*): INVALID KEY나 NOT INVALID KEY phrase가 지정되어 있지 않은 경우

(+): AT END, NOT AT END, INVALID KEY, NOT INVALID KEY phrase가 지정되어 있지 않은 경우

(-) : INVALID KEY, NOT INVALID KEY, END-OF-PAGE, NOT END-OF-PAGE phrase가 지정되어 있지 않은 경우

Ordering

  • MERGE

  • RELEASE

  • RETURN(*)

  • SORT

[참고]

(*) : AT END나 NOT AT END phrase가 지정되어 있지 않은 경우

Procedure-branching

  • ALTER

  • EXIT

  • GO TO

  • PERFORM

Program linkage

  • CALL(*)

  • CANCEL

[참고]

(*) : ON OVERFLOW phrases와 ON EXCEPTION이나 NOT ON EXCEPTION phrase가 지정되어 있지 않은 경우

Table-handling

  • SET

1.6.2. Conditional statement

조건 구문(conditional statement)은 구문에 해당하는 조건문을 지정하고 조건문에 참일 경우에 실행되어질 액션을 기술한 구문을 의미한다.

COBOL에서 조건 구문에는 다음과 같은 것이 있다.

항목 설명

Arithmetic

  • ADD ON SIZE ERROR

  • ADD NOT ON SIZE ERROR

  • COMPUTE ON SIZE ERROR

  • COMPUTE NOT ON SIZE ERROR

  • DIVIDE ON SIZE ERROR

  • DIVIDE NOT ON SIZE ERROR

  • MULTIPLY ON SIZE ERROR

  • MULTIPLY NOT ON SIZE ERROR

  • SUBTRACT ON SIZE ERROR

  • SUBTRACT NOT ON SIZE ERROR

Data movement

  • STRING ON OVERFLOW

  • STRING NOT ON OVERFLOW

  • UNSTRING ON OVERFLOW

  • UNSTRING NOT ON OVERFLOW

Decision

  • IF

  • EVALUATE

Input-output

  • ADD ON SIZE ERROR

  • DELETE INVALID KEY

  • DELETE NOT INVALID KEY

  • READ AT END

  • READ NOT AT END

  • READ INVALID KEY

  • READ NOT INVALID KEY

  • REWRITE INVALID KEY

  • REWRITE NOT INVALID KEY

  • START INVALID KEY

  • START NOT INVALID KEY

  • WRITE AT END-OF-PAGE

  • WRITE NOT AT END-OF-PAGE

  • WRITE INVALID KEY

  • WRITE NOT INVALID KEY

Ordering

  • RETURN AT END

  • RETURN NOT AT END

Program linkage

  • CALL ON OVERFLOW

  • CALL ON EXCEPTION

  • CALL NOT ON EXCEPTION

Table-handling

  • SEARCH

1.6.3. Delimited scope statements

DELIMITED SCOPE statement는 explicit scope terminator를 통해 conditional statement를 imperative statement로 바꾼다.

1.6.4. Explicit scope terminators

범위 구분자(explicit scope terminator)는 Procedure division의 특정 구문들의 범위를 표시한다. 범위 구분자가 지정된 조건 구문은 비조건 구문으로 간주되며, 비조건 구문 규칙을 따라야 한다.

Procedure division에서 사용되는 범위 구분자는 다음과 같은 것이 있다.

  • END-ADD

  • END-CALL

  • END-COMPUTE

  • END-DELETE

  • END-DIVIDE

  • END-EVALUATE

  • END-IF

  • END-MULTIPLY

  • END-PERFORM

  • END-READ

  • END-REWRITE

  • END-RETURN

  • END-SEARCH

  • END-START

  • END-STRING

  • END-SUBTRACT

  • END-UNSTRING

  • END-WRITE

1.6.5. Implicit scope terminators

문장(sentence) 끝에는 범위 구분자로 점(.)을 사용한다. 점은 아직 종료되지 않은 이전의 모든 구문의 범위를 종결하는 의미를 가진다. 종결되지 않은 조건 구문 내에는 다른 구문이 포함될 수 없다.

IF 구문 내에 조건문을 포함하는 경우를 제외하고는 다른 구문에 포함된 구문들은 비조건 구문이어야 한다.

1.7. Statement operations

본 절에서는 산술 연산을 수행하거나 데이터를 조작하는 구문에서 공통으로 사용되는 pharse에 대해서 설명한다.

1.7.1. CORRESPONDING phrase

CORRESPONDING paragraph는 ADD, SUBTRACT, MOVE statement에 기술했을 경우 지정한 그룹 데이터 항목의 operation에 있어서 동일한 이름을 가지고 있는 elementary 데이터 항목들에 대해 ADD, SUBTRACT, MOVE operation을 실행하게 된다.

CORRESPONDING keyword 이후에 지정하는 데이터 항목은 그룹 항목을 지정해야 한다. 여기서는 identifier-1은 sending 그룹 항목을 identifier-2를 receiving 그룹 항목을 의미 한다.

identifier-1과 identifier-2에 종속된 데이터 항목에 대해서 아래와 같은 조건이 만족해야지만 해당하는 operation이 실행된다.

  • ADD나 SUBTRACT statement에 대해서 두 개의 elementary 데이터 항목은 모두 numeric 데이터 항목이어야 한다. numeric이 아닌 데이터 항목에 대해서는 add나 subtract에 대한 operation은 수행되지 않는다.

  • 그룹에 종속된 서브 데이터 항목은 이름이 같아야할 뿐만 아니라 identifier-1과 identifier-2의 이름을 제외한 qualifer들도 같아야 한다.

  • FILLER는 제외된다.

  • level-66, level-77, level-88 인덱스 데이터 항목 또는 reference-modified가 지정된 항목은 identifer-1과 identifier-2로 기술할 수 없다.

  • USAGE POINTER, USAGE FUNCTION-POINTER, USAGE PROCEDURE-POINTER이 지정된 항목은 identifier-1 또는 identifier-2로 지정할 수 없다.

  • identifier-1 또는 identifier-2에 종속된 항목은 USAGE POINTER, USAGE PROCEDURE-POINTER, REDEFINES, RENAMES, OCCURS가 지정되어 있는 경우는 처리 대상에서 제외된다.

1.7.2. GIVING phrase

GIVING 이후에 기술한 식별자에는 산술 연산에는 관여하지 않으며, 산술 연산의 결과값만 저장된다. 따라서 numeric-edited 항목도 지정 가능하다.

1.7.3. ROUNDED phrase

소수점 정렬을 한 후에, 연산 실행에 대한 결과값은 결과값이 저장될 항목에 기술된 자릿수와 비교가 이루어진다. 이때 결과값이 이 자릿수를 초과하는 경우에는 초과되는 자릿수만큼 truncation(버림)이 발생한다. 단, ROUNDED phrase가 지정되어 있는 경우에는 초과된 자릿수의 가장 왼쪽의 수가 5 이상이면 반올림이 발생한다.

결과 값이 저장될 항목의 PICTURE clause에 결과값이 자릿수를 초과할 경우 버림 또는 반올림이 발생한다. floating-point 연산은 ROUNDED paragraph 지정에 상관 없이 항상 반올림이 발생한다.

1.7.4. SIZE ERROR phrase

SIZE ERROR는 아래의 조건에서 발생한다.

  • 산술 연산 결과에 대한 절댓값이 결과를 저장할 필드의 최댓값을 초과했을 경우

  • 0으로 나누는 경우

SIZE ERROR는 중간값이 아닌 최종 결과값에서만 적용된다. USAGE BINARY, COMP, COMP-4, COMP-5 데이터 항목이 결과값으로 저장할 수 있는 최댓값은 해당 데이터 항목에 지정된 PICTURE character-string에 의해 정해진다.

ROUNDED paragraph가 지정되어 있는 경우 size error를 체크하기 전에 rounding이 이루어진다.

SIZE ERROR조건이 발생한 후의 동작은 ON SIZE ERROR paragraph 지정에 따라 달라진다.

  • ON SIZE ERROR paragraph가 지정되지 않고 size error 조건이 발생한 경우는 truncation 규칙이 적용되어 truncation된 값이 결과에 저장된다.

  • ON SIZE ERROR paragraph가 지정되어 있고, size error 조건이 발생한 경우는 계산 결과값은 저장되지 않고 ON SIZE ERROR paragraph에 지정한 비조건 구문(imperative statement)가 실행된 후에 콘트롤은 연산 구문 다음 기술된 구문으로 넘어간다.

ADD CORRESPONDING과 SUBTRACT CORRESPONDING statement에 대해서 개별 연산을 수행하는 도중에 size error 조건이 발생하게 되면 개별 연산이 모두 완료되기 전까지 ON SIZE ERROR paragraph에 지정된 비조건문은 실행되지 않는다.

NOT ON SIZE ERROT paragraph가 지정되어 있고 연산 처리할 때 size error가 발생하지 않은 경우는 NOT ON SIZE ERROR paragraph에 기술된 비조건 구문이 실행된다.

1.7.5. Arithmetic statement operands

산술 연산을 하는 도중에 필요에 따라 컴파일러가 내부적으로 데이터 변환이나 소수점 정렬을 수행하기 때문에 산술 연산 오퍼랜드(arithmetic statement operand)들은 동일한 데이터 정의를 가질 필요는 없다.

  • size of operands(오퍼랜드의 크기)

    오퍼랜드는 31 소수점 이하 자리까지 지정 가능하다.

    모든 연산 구문에 있어서 최종 결과값에 대한 정확성을 보장하기 위해 정수 자릿수와 소수점 이하 자릿수를 충분히 지정하는 것이 중요하다.

  • composite operands는 operand사이의 소수점 자리수를 맞춰서 operand의 값을 재정렬한 컴파일러 내부적으로 연산처리에 사용되는 데이터 항목이다.

    예를 들어 아래와 같은 데이터 항목으로 더하기 연산을 수행하는 경우에 컴파일러 내부적으로 PIC 9(12)V9(7) 형태와 같은 데이터 항목으로 각 operand을 변환해서 연산을 수행하게 된다.

    A PIC 9(7)V9(5)
    c PIC 9(11)V99
    B PIC 9(12)V9(3)
    ADD A B TO C
  • operand overapping

    연산 구문에서 오퍼랜드가 메모리 저장공간을 공유하는 경우 즉 operand가 overlapping되어 있는 경우, 연산 실행 결과는 보장할 수 없다.

  • Multiple result

    연산 구문이 복수개의 항목에 실행 결과를 저장하는 경우는 개념적으로 아래와 같이 처리된다.

    1. TO 또는 FROM 이전에 기술된 산술 연산을 실행한 중간 결과값을 임시 변수에 저장한다.

    2. 임시 변수에 저장된 중간 결과 값과 오퍼랜드로 지정된 항목에 대해서 산술 연산을 실행후에 그 결과값을 저장한다.

1.7.6. Data manipulation statement

다음 statements들은 데이터를 이동 또는 점검한다.

  • ACCEPT

  • INITIALIZE

  • INSPECT

  • MOVE

  • READ

  • RELEASE

  • RETURN

  • REWRITE

  • SET

  • STRING

  • UNSTRING

  • WRITE

statement의 sending and receiving fields의 저장 영역이 중첩될 경우 결과를 예측할 수 없다.

1.7.7. Input-output statements

Input-output statements는 파일에 데이터를 저장하거나 파일로 부터 데이터를 가져온다. COBOL에서 파일에 읽고 쓰는 데이터의 단위는 레코드이다. Environment division과 data division안의 파일에 대한 description에 따라 procedure division에 어떠한 input-output statements를 사용할수 있는지 결정된다.

1.7.8. Common processing facilities

다음과 같은 Common processing facilities가 있다.

  • File status key

    File-control entry에 기술된 FILE STATUS clause가 기술되어 있다면, 파일에 대한 statement가 실행된 후 해당 결과 값이 기술된 file status key(FILE STATUS KEY caluse에 의해 지정된 2문자 데이터 항목)에 저장된다. 그 값은 EXCEPTION/ERROR declarative, INVALID KEY phrase 또는 AT END phrase가 실행되기 전에 저장된다.

    2개의 File status key data-name이 있다. 하나는 FILE STATUS clause의 data-name-1이다. 이것은 두 개의 문자로 되어 있는데, 첫 번째 문자는 file status key 1이라고 하고, 두 번째 문자는 file status key 2라고 한다.

    다음은 File status key의 값에 대한 설명이다.

    file status key 설명

    00

    Successful completion된 경우이다.

    02

    Indexed file에 적용된다. Successful completion이고, duplicate key가 발생했다.

    07

    Successful completion이다. NO REWIND, REEL/UNIT, or FOR REMOVAL phrase를 가진 CLOSE statement 또는 NO REWIND phrase를 가진 OPEN statement에 대하여 파일이 테이프가 아닌 경우이다.

    10

    At-end condition이다. Sequential READ statement 실행에 대하여 더 이상의 레코드가 없는 경우이다.

    14

    At-end condition이다. Sequential READ statement가 relative file에 대해 실행되었고, relative key가 범위를 초과한 경우이다.

    22

    Invalid key condition이다. Relative file에 대하여 write할 때 또는 indexed file에 대하여 write, rewrite하는 경우이다.

    23

    Invalid key condition이다. READ, START statement에 대하여, 키에 해당하는 레코드가 파일에 존재하지 않은 경우이다.

    37

    Sequential dataset에 random acess 사용 할 때. 또는 Relative file에 extend mode 사용한다.

    38

    CLOSE WITH LOCK으로 종료된 파일에 대하여 OPEN statement를 사용할 때 발생한다.

    39

    COBOL 프로그램에 기술된 파일의 속성과 물리적인 파일의 속성이 다른 경우이다.

    (RECORD FORMAT, RECORD LENGTH, FILE ORGANIZATION, etc)

    41

    Open하려는 파일이 이미 open된 경우이다.

    42

    Open되지 않은 파일을 close하는 경우이다.

    43

    Sequential access mode에서 REWRITE 또는 DELETE statement를 실행 하려 할 때 마지막에 실행되었던 I/O statement가 READ statement가 아닌 경우이다.

    44

    RECORD IS VARYING clause인 파일에 대하여 레코드 길이 범위를 벗어난 레코드를 write, rewrite하려는 경우이다.

    46

    Sequential READ statement를 실행하려 할 때 이전 READ statement가 at-end condtion으로 종료되어 다음 레코드에 대한 file pointer indicator가 설정되지 못한 경우이다.

    47

    READ statement를 실행하려 할 때 파일이 INPUT 또는 I-O mode로 open되지 않은 경우이다.

    48

    WRITE statement를 실행하려 할 때 파일이 OUTPUT, I-O 또는 EXTEND mode로 open되지 않은 경우이다.

    49

    DELETE 또는 REWRITE statement를 실행하려 할 때 파일이 I-O mode로 open되지 않은 경우이다.

    92

    READ statement 실행할 때 읽어온 레코드의 길이가 COBOL 프로그램에 기술된 길이보다 큰 경우이다.

    또 다른 File status key data-name은 FILE STATUS clause의 data-name-8이다. 이 값은 사용되지 않는다.

  • Invalid key condition

    START, READ, WRITE, REWRITE, 또는 DELETE statement가 실행되는 동안 invalid key condition이 발생할 수 있다. Invalid key condition이 발생하면 다음에 따라서 동작이 이루어진다.

    1. File-control entry에 FILE STATUS clause가 기술되어 있다면, invalid key condition에 해당하는 값이 file status key에 저장된다.

    2. INVALID KEY phrase가 기술되어 있으면, 해당 phrase에 기술된 imperative statement가 실행된다. 이 파일에 대해 기술된 EXCEPTION/ERROR Declarative procedure는 실행되지 않는다.

    3. INVALID KEY phrase가 기술되어 있지 않으면, 이 파일에 대해 기술된 EXCEPTION/ERROR Declarative procedure가 기술되어 있으면 실행된다. NOT INVALID KEY phrase는 무시된다.

2. statement

다음은 각 statement의 목록이다. 상세한 설명은 각 절의 내용을 참고한다.

statement 설명

ACCEPT

기술된 identifier가 참조하는 데이터 영역으로 데이터나 시스템 날짜 관련 정보를 전송한다.

ADD

두 개 이상의 오퍼랜드를 더한 결과값을 특정 오퍼랜드에 저장하는 statement이다.

CALL

프로그램 수행 중에 한 프로그램에서 다른 프로그램으로 프로그램의 제어를 변경시킬 때 사용하는 statement이다.

CANCEL

오퍼랜드로 지정한 프로그램을 initial state로 처리하기 위해서 사용한다.

CLOSE

파일에 대한 작업을 종료한다.

COMPUTE

산술 연산식의 결과값을 한 개 이상의 데이터 항목에 저장하는 구문이다.

CONTINUE

프로그램 내에서 아무런 작업을 수행하지 않는다.

DELETE

indexed file 또는 relative file의 레코드를 삭제한다.

DISPLAY

각각의 피연산자의 내용을 출력장치로 전송한다.

DIVIDE

numeric 데이터 항목이나 문자상수를 INTO 이후에 지정한 데이터 항목으로 나눈 몫을 저장하는 구문이다.

ENTRY

ENTRY 구문은 서브 프로그램 호출할 때 PROGRAM-ID에 지정한 프로그램 이름이나 파일 이름 이외에 별도의 이름으로 서브 프로그램을 호출하기 위해 지정하기 설정하는 입구점(entry point)이다.

EVALUATE

충첩된 IF statement의 간편한 사용을 제공한다.

EXIT

procedure의 마지막을 의미한다.

EXIT PARAGRAPH

현재 paragraph를 종료하고 프로그램의 제어를 다음 procedure로 넘긴다.

EXIT PROGRAM

호출된 프로그램을 종료하고 호출한 프로그램으로 프로그램의 제어가 넘어간다.

GOBACK

서브 프로그램 내에서는 프로그램의 제어를 메인 프로그램으로 전달하고, 메인 프로그램에서는 프로그램을 종료하는 기능을 수행한다.

GO TO

프로그램의 제어를 Procedure division 내의 다른 위치로 전달한다.

IF

조건을 판정하여 그 결과에 따라서 작업을 제공한다.

INITIALIZE

identifier-1에 기술한 데이터 카테고리에 따라 특정값을 identifier-1에 설정하거나 REPLACING phrase가 지정되어 있는 경우는 identifier-2 또는 literal-1의 값을 identifier-1에 설정하는 구문이다.

INSPECT

문자열 내 특정 character의 빈도를 세거나, 여러 가지 조작을 수행한다.

MERGE

정렬된 파일들을 병합한다.

MOVE

특정 메모리 영역을 한 개 혹은 여러 개의 다른 메모리 영역으로 복사한다.

MULTIPLY

numeric item을 곱해서 그 결과 값을 지정한 데이터 항목에 저장하는 구문이다.

OPEN

파일 작업을 개시한다.

PERFORM

프로그램 실행 중에 프로그램의 제어를 명시적으로 하나 이상의 다른 procedure로 넘길 때 사용하는 statement이다.

READ

Sequential access에 대하여, 파일로부터 다음 레코드를 읽어온다.

RELEASE

정렬 작업 처리를 시작하기 전에 레코드를 정렬 작업 영역으로 전송한다.

RETURN

정렬 작업 처리 종료 후에 레코드를 정렬 작업 영역에서 Output procedure로 전송 한다.

REWRITE

기존에 존재하는 파일의 레코드를 바꿔준다.

SEARCH

주어진 조건을 만족하는 element를 찾기 위해 테이블을 검색한다.

SET

테이블에 대한 관리를 위한 INDEX 항목 값을 지정하거나 INDEX 항목을 지정한 값으로 증가 혹은 감소시킨다.

SORT

한 개 이상의 파일로부터 레코드를 받아서 기술된 키에 따라서 정렬한다.

START

indexed 또는 relative file에서 이어지는 다음 레코드를 읽기 위한 레코드 위치를 설 정한다.

STOP

프로그램의 수행을 일시적으로 또는 영구적으로 중단한다.

STRING

STRING statement는 2개 이상의 데이터 항목이나 리터럴의 내용 일부 또는 전부를 하나로 합쳐서 하나의 데이터 항목으로 만든다.

SUBTRACT

한 개의 numeric item이나 numeric item들의 합에서 FROM 이후에 지정된 nu meric 데이터 항목과 빼서 그 결과값을 FROM 이후에 지정된 데이터 항목에 저장한다.

UNSTRING

소스로 입력된 필드 중 연속된 데이터를 여러 개의 필드로 분할할 수 있다.

WRITE

레코드를 출력 파일에 쓴다.

XML GENERATE

데이터를 XML 형식으로 변환한다.

XML PARSE

XMLPARSE 컴파일러 옵션의 설정에 따른 COBOL 언어 인터페이스이다.

2.1. ACCEPT

ACCEPT statement는 기술된 identifier가 참조하는 데이터 영역으로 데이터나 시스템 날짜 관련 정보를 전송한다. 입력되는 데이터에 대해 어떠한 편집이나 에러 체크도 하지 않는다.

Data transfer

데이터를 FROM phrase에 기술된 입력 장치로부터 idenfifier-1에 의해 참조되는 데이터 항목으로 전송한다. FROM phrase가 생략되면, 시스템 입력 장치로 가정한다.

Format 1은 오퍼레이터의 관여가 필요한 프로그램 상황에 유용하다. 오퍼레이터는 응답으로 적당한 메시지를 제공해야 한다.

figure pd accept format1 data transfer
Accept Statement Format 1

다음은 statement의 각 설정 항목에 대한 설명이다.

  • identifier-1

    • 데이터가 전송되는 곳이다.

    • 다음의 데이터 항목이 될 수 있다.

      • alphanumeric group item

      • USAGE가 DISPLAY 또는 DISPLAY-1인 elementary 데이터 항목

  • mnemonic-name-1

    • SPECIAL-NAMES paragraph에 environment-name으로 기술된 입력 장치를 지정한다.

  • environment-name-1

    • 입력 데이터의 source를 지정한다. CONSOLE, SYSIN이 될 수 있다.

DATE, DATE YYYYMMDD, DAY, DAY YYYYDDD, DAY-OF-WEEK 또는 TIME 데이터 항목에 담겨진 시스템 정보를 identifier-2가 참조하는 데이터 항목으로 전송한다. 이 전송은 CORRESPONDING phrase가 없는 MOVE starement 규칙에 따른다.

figure pd accept format2 system information transfer
Accept Statement Format 2
  • identifier-2

    • 다음의 데이터 항목이 될 수 있다.

      • alphanumeric group item

    • 다음은 카테고리 중 하나에 속한 elementary 데이터 항목이다.

      • alphanumeric

      • alphanumeric-edited

      • numeric-edited(with USAGE DISPLAY)

      • numeric

      • internal floating-point

      • external floating-point(with USAGE DISPLAY)

Format2는 dy of the week과 time of day 두 가지 방법으로 current date를 받는다. 현재 날짜와 시간은 intrinsic function CURRENT-DATE를 이용해 받을 수도있다.

DATE, DATE YYYYMMDD, DAY, DAY YYYYDDD, DAY-OF-WEEK, TIME

DATE, DATE YYYYMMDD, DAY, DAY YYYYDDD, DAY-OF-WEEK, TIME은 묵시적으로 USAGE DISPLAY를 가진 데이터 항목이다.

항목 설명

DATE

PICTURE 9(6)으로 표현된다. 왼쪽부터 두 자리는 연도, 다음 두 자리는 월, 다음 두 자리는 일을 나타낸다. 예를 들면 2012년 4월 30일은 120430이 된다.

DATE YYYYMMDD

PICTURE 9(8)로 표현된다. 4자리 연도를 표현한다. 왼쪽부터 네 자리는 연도, 다음 두 자리는 월, 다음 두 자리는 일을 나타낸다. 예를 들면 2012년 4월 30일은 20120430이 된다.

DAY

PICTURE 9(5)로 표현된다. 왼쪽부터 두 자리는 연도, 다음 세자리는 일을 나타낸다. 세 자리수의 일은 1월 1일부터의 일의 수이다. 예를 들면 2012년 4월 30일은 12121이 된다.

DAY YYYYDDD

PICTURE 9(7)으로 표현된다. 4자리 연도를 표현한다. 왼쪽부터 네 자리는 연도, 다음 세 자리수는 일을 나타낸다. 세 자리수의 일은 1월 1일부터의 일의 수이다. 예를 들면 2012년 4월 30일은 2012121이 된다.

DAY-OF-WEEK

PICTURE 9(1)로 표현된다. 요일을 숫자로 표현한다. 월,화,수,목,금,토,일에 각각 1,2,3,4,5,6,7이 대응된다. 예를 들면 수요일은 3으로 표현된다.

TIME

PICTURE 9(8)로 표현된다. 시간을 표시한다. 왼쪽부터 두 자리는 시, 다음 두 자리는 분, 다음 2자리는 초, 다음 두 자리는 100분의 초를 나타낸다. 예를 들면 오후 2시 41분은 14410000이 된다.

2.2. ADD

ADD statement는 2개 이상의 오퍼랜드를 더한 결과값을 특정 오퍼랜드에 저장한다.

  • Format 1

    Format 1은 TO 앞에 기술된 identifier(식별자)나 문자상수들을 더한 결과값이 TO 이후에 기술된 identifier-2와 합해져서 identifier-2에 저장된다. 이러한 과정은 identifier-2 자리에 지정된 식별자의 개수 만큼 왼쪽에서 오른쪽으로 진행하면서 반복된다.

    figure pd add format1
    ADD Statement Format 1
  • Format 2

    Format 2는 GIVING 앞에 기술된 오퍼랜드들이 더해진 결과값이 identifier-3에 기술된 오퍼랜드들에 저장된다.

    figure pd add format2
    ADD Statement Format 2
  • Format 3

    Format 3은 identifier-1의 elementary 데이터 항목이 identifier-2에 대응되는 데이터 항목 이름이 동일한 데이터 항목과 더해져서 그 결과값이 identifier-2의 elementary 데이터 항목에 저장된다.

    figure pd add format3
    ADD Statement Format 3

다음은 statement의 각 설정 항목에 대한 설명이다.

  • identifier

    • Format 1에서는 모두 elementary numeric item이어야 한다.

    • Format 2에서는 GIVING 이후에 기수한 식별자를 제외하고는 모두 elementary numeric 항목이어야 한다. GIVING 이후에 기술한 식별자는 elementary numeric item이거나 numeric-edited item이어야 한다.

    • Format 3에서는 alphanumeric 그룹 항목이어야 한다.

  • literal

    • 모두 상수문자여야 한다.

  • ROUND phrase

  • SIZE ERROR phrase

  • CORRESPONDING phrase

  • END-ADD phrase

    • END-ADD phrase는 ADD statement의 범위를 명시적으로 나타낼 때 사용한다. 이 phrase는 다른 조건 구문에 ADD 구문이 포함되었을 때 사용할 수 있다.

2.3. CALL

CALL statement는 프로그램 수행 중에 한 프로그램에서 다른 프로그램으로 프로그램의 제어를 변경시킬 때 사용한다. CALL statement를 사용하여 다른 프로그램을 호출하는 프로그램을 Calling program이라고 하고, Calling program에 의해서 호출되는 프로그램을 Called program이라고 한다.

Called program 역시 CALL statement를 사용하여 다른 프로그램을 호출할 수 있다. 직접 또는 간접적으로 자기 자신의 프로그램을 호출하기 위해서는 프로그램을 정의할 때 RECURSIVE로 정의된 경우에만 가능하다.

figure pd call
CALL Statement Format
figure pd exception phrases
CALL Statement Format : exception-phrases
figure pd not exception phrase
CALL Statement Format : not-exception-phrase

다음은 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가 종료되었다는 것을 지정한다.

2.4. CANCEL

CANCEL statement는 오퍼랜드로 지정한 프로그램을 다음번 호출시 initial state로 처리하기 위해서 사용한다.

COBOL 프로그램에서 CALL statement를 이용해서 서브 프로그램을 호출하게 되면 CALL statement가 종료되어도 서브 프로그램 내의 데이터 항목에는 CALL statement를 사용하는 동안 이용했던 데이터 값이 저장되어 있다. CANCEL statement는 이러한 서브 프로그램 내의 데이터 항목의 값을 EXTERNAL clause로 선언된 변수를 사용하는 경우를 제외하고 초기화한다. 따라서, CALL statement로 서브 프로그램을 호출한 후에 CANCEL statement를 호출한 후 다시 CALL statement를 호출하게 되면, 서브 프로그램을 처음 호출한 것처럼 사용할 수 있다.

CANCEL statement가 호출되면, CANCEL statement가 참조하는 모든 서브 프로그램에 대해서도 동일하게 CANCEL statement를 호출한 것과 같은 효과를 볼 수 있다. 즉, 각각의 서브 프로그램에 대해서 CANCEL statement를 수행한 것과 동일한 결과를 볼 수 있다.

CANCEL statement는 지정한 프로그램내에서 OPEN한 모든 파일을 자동으로 CLOSE한다.

CALL statement로 호출하는 서브 프로그램에서도 CANCEL statement를 수행할 수는 있다. 그러나, CANCEL statement가 수행되면서 서브 프로그램이나 다른 프로그램에 영향을 줄 수 있기 때문에 서브 프로그램에서 CALL statement를 수행해서는 안된다.

figure pd cancel
CANCEL Statement Format

다음은 statement의 각 설정 항목에 대한 설명이다.

  • identifier-1, literal-1

    • literal-1과 identifier-1은 program-name을 지정할 수 있어야 한다.

    • literal-1은 alphanumeric literal이어야 하며, identifier-1은 alphanumeric이나 alphabetic이거나 zoned decimal 데이터 항목이어야 한다.

2.5. CLOSE

CLOSE statement는 파일에 대한 작업을 종료한다. File-control entry에 FILE STATUS clause가 기술되어 있으면, CLOSE statement가 실행되고, 해당하는 값으로 file status key가 갱신된다.

  • Format 1

    REEL, UNIT, and NO REWIND phrases는 VSAM files에서 사용할 수 없다.

    figure pd close format1 sequential
    CLOSE Statement Format 1
  • Format 2

    figure pd close format2 indexed and relative
    CLOSE Statement Format 2
  • Format 3

    figure pd close format3 line sequential
    CLOSE Statement Format 3

다음은 statement의 각 설정 항목에 대한 설명이다.

  • file-name-1

    • Open statement에 사용한 file name을 지정한다. 여러 개의 파일을 지정할 경우 각 파일의 organization이나 access mode가 같을 필요는 없다.

    • sort/merge 파일을 사용해선 안된다.

  • REEL, UNIT

    • 파일이 저장되는 장치의 속성 지정한다.

  • WITH NO REWIND, FOR REMOVAL

    • 테이프 파일에만 적용된다. 이 속성이 적용될수 없는 장치에 파일 CLOSE statement 실행은 정상적으로 이루어지고, file status에는 해당 장치가 테이프 파일이 아니고 알려주는 값이 저장된다.

2.6. COMPUTE

COMPUTE statement는 산술 연산식의 결과값을 한 개 이상의 데이터 항목에 저장하는 구문이다. COMPUTE statement에 지정하는 덧셈, 뺄셈, 곱셈, 나눗셈 등을 조합한 산술 연산식 조합에는 제한이 없다.

figure pd compute
COMPUTE Statement Format

다음은 statement의 각 설정 항목에 대한 설명이다.

  • identifier-1

    • identifier-1은 elementary numeric item이나 elementary numeric-edited item, elementary floating-point item을 지정해야 한다.

  • arithmetic-expression

    • 덧셈, 뺄셈, 곱셈, 나눗셈 등의 어떠한 산술 연산식도 지정이 가능하다.

    • COMPUTE statement가 수행되면, 산술 연산식의 결과값이 계산되어진 후에 그 결과값이 identifier-1에 지정된 데이터 항목에 저장된다.

    • 산술 연산식이 한 개의 identifier, numeric function, 문자열로만 구성되어 있는 경우, COMPUTE phrase은 identifier, numeric function, 문자열을 identifer-1에 move하는 기능과 동일하다.

  • ROUNDED phrase

  • SIZE ERROR phrase

  • END-COMPUTE phrase

    • END-COMPUTE phrase는 COMPUTE statement의 범위를 명시적으로 표현하기 위해 지정한다.

2.7. CONTINUE

CONTINUE statement는 프로그램 내에서 아무런 작업을 수행하지 않는다. 현재 수행할 문장이 없는 것을 의미한다.

figure pd continue
CONTINUE Statement Format

2.8. DELETE

DELETE statement는 file의 레코드를 삭제한다.

DELETE statement을 사용할 때 해당 파일은 I-O mode로 open되어 있어야 한다. DELETE statement가 성공적으로 수행되면, 레코드는 삭제되고 더 이상 사용할 수 없다.

file-control entry에 FILE STATUS가 기술되어 있다면 DELETE statement이 실행된 후 file status key가 갱신된다.

figure pd delete
DELETE Statement Format

다음은 statement의 각 설정 항목에 대한 설명이다.

  • file-name-1

    • 반드시 Data division FD entry에 기술되어 있어야 하고 indexed file 또는 relative file의 이름이어야 한다.

  • END-DELETE phrase

    • 명시적으로 DELETE statement의 끝을 나타낸다.

다음은 각 mode별 DELETE statement 사용에 대한 설명이다.

  • Sequential access mode

    • DELETE statement을 수행하기 전에 READ statement이 성공적으로 수행되어야 한다. DELETE statement이 실행되면 시스템은 바로 전에 READ statement로 읽은 레코드를 삭제한다.

    • Sequential access mode인 파일에 대해서 INVALID KEY, NOT INVALID KEY phrase는 사용되어서는 안된다.

  • Random or dynamic access mode

    • Random 또는 dynamic access mode에서 DELETE statement 실행 결과는 file organizaion(indexed 또는 relative)에 달려 있다.

    • DELETE statement이 실행되었을때, 시스템은 indexed file의 prime RECORD KEY 데이터 항목 또는 relative file의 RELATIVE KEY 데이터 항목에 따라 레코드를 삭제한다.

    • 파일이 해당 레코드를 가지지 않는다면 invalid key condition이 발생한다.

2.9. DISPLAY

DISPLAY statement는 각각의 피연산자의 내용을 출력장치로 전송한다. 피연산자가 열거된 순서대로 왼쪽에서 오른쪽으로 내용이 출력장치에 표시된다.

figure pd display
DISPLAY Statement Format

다음은 statement의 각 설정 항목에 대한 설명이다.

  • identifier-1

    • identifier-1은 출력장치에 표시될 데이터를 참조한다.

    • identifier-1은 USAGE INDEX, PROCEDURE-POINTER, FUNCTION-POINTER를 제외한 어떠한 데이터 항목도 사용될 수 있다. identifier-1이 binary, internal decimal 또는 internal floating-pointer이면, identifier-1은 자동적으로 다음의 external format으로 바뀐다.

      • Binary와 internal decimal item들은 Zoned decimal 숫자로 변환된다.

      • Internal floating-point 숫자는 다음과 같이 external floating-point 숫자로 변환된다.

        • COMP-1 항목은 -.9(7)E-99의 PICTURE clause를 가진 external floating-point로 표시된다.

        • COMP-2 항목은 -.9(15)E-99의 PICTURE clause를 가진 external floating-point로 표시된다.

    • USAGE POINTER로 정의된 데이터 항목은 PIC 9(10)을 가진 Zoned decimal 숫자로 변환된다. 다른 카테고리는 변환이 필요없다. DBCS와 non-DBCS operand가 한 DISPLAY statement에서 함께 쓰일 수 있다.

  • literal-1

    • 어떠한 리터럴이나 Figurative constant라도 될수 있다. Figurative constant가 쓰일 경우 길이 1만큼 display된다.

  • UPON

    • environment-name-1 또는 mnemonic-name-1은 반드시 출력장치와 관련되어야 한다(environment-name-1 또는 mnemonic-name-1에 대한 내용은 SPECIAL-NAMES paragraph를 참고한다).

    • UPON phrase가 생략되면 시스템 출력장치(예 : stdout)가 가정된다.

  • WITH NO ADVANCING

    • phrase가 기술되면, DISPLAY statement에 의해 피연산자의 내용이 출력장치로 전달된 후에, 출력장치는 다음 라인의 가장 왼쪽에 position을 옮기지 않고 현재 피연산자의 가장 마지막에 position이 그래도 남아 있다.

OFCOBOL은 출력장치를 직접 제어하지 않기 때문에 이 WITH NO ADVANCING phrase이 의미 없을 수도 있다. (예: UPON CONSOLE)

2.10. DIVIDE

DIVIDE statement는 numeric 데이터 항목이나 문자상수를 INTO 이후에 지정한 데이터 항목으로 나눈 몫을 저장하는 구문이다.

  • Format 1

    Format 1은 identifier-1 또는 literal-1을 나누는 수(제수)로 identifier-2을 나뉘는 수(피제수)로 나눗셈 연산을 실행해 나눈 몫을 identifier-2에 저장한다. identifier-2가 여러 개 지정되어 있는 경우는 왼쪽에서 오른쪽으로 지정된 반복해서 나누기 연산을 실행하여 각각의 몫을 해당하는 identifier-2에 저장한다.

    figure pd divide format1
    DIVIDE Statement Format 1
  • Format 2

    Format 2는 identifier-1또는 literal-1을 나누는 수(제수)로 identifier-2또는 literal-2를 나뉘는 수(피제수)로 나눗셈 연산을 실행해 그 몫을 identifier-3에 저장한다.

    figure pd divide format2
    DIVIDE Statement Format 2
  • Format 3

    Format 3은 identifier-1또는 literal-1을 나뉘는 수로 identifier-2, literal-2를 나누는 수로 해서 나눗셈 연산을 실행해서 그 몫을 identifier-3에 저장한다.

    figure pd divide format3
    DIVIDE Statement Format 3
  • Format 4

    Format 4는 identifier-1또는 literal-1을 나누는 수(제수)로 identifier-2또는 literal-2를 나뉘는 수(피제수)로 나눗셈 연산을 실행해 그 몫과 나머지를 identifier-3과 identifier-4에 저장한다.

    figure pd divide format4
    DIVIDE Statement Format 4
  • Format 5

    Format 5는 identifier-1또는 literal-1을 나뉘는 수로 identifier-2, literal-2를 나누는 수로 해서 나눗셈 연산을 실행해서 그 몫과 나머지를 identifier-3과 identifier-4에 저장한다.

    figure pd divide format5
    DIVIDE Statement Format 5

다음은 statement의 각 설정 항목에 대한 설명이다.

  • identifer-1, identifier-2

    • identifier-1또는 identifier-2는 모두 elementary numeric 데이터 항목이어야 한다.

  • identifier-3, identifier-4

    • identifier-3과 identifier-4는 elementary numeric이나 numeric-edited item이어야 한다.

  • literal-1, literal-2

    • literal-1과 literal-2는 문자 상수이어야 한다.

  • ROUNDED phrase

    • format 1, 2, 3은 Statement operationsROUNDED phrase를 참고한다.

    • format 4와 5에서는 나머지를 계산하기 위해 사용된 몫이 중간값에 저장되고 이 중간값은 round 대신 truncation이 일어난다.

  • REMAINDER phrase

    • identifier-4에 저장되는 값은 나뉘는 수에서 몫과 나누는 수를 곱한 값을 뺀수가 저장된다. 만약 identifier-3가 numeric-edited 항목이면 나머지를 계산하기 위해 편집이 되지 않은 중간값이 몫으로 사용된다.

    • floating-point를 operand나 저장값으로 사용하는 경우, REMAINDER phrase는 사용할 수 없다.

  • SIZE ERROR phrase

    • format 1, 2, 3에 대해서는 Statement operationsSIZE ERROR phrase를 참고한다.

    • format 4, 5에 대해서 몫에 해당하는 값이 size error가 발생했을 경우 나머지 계산은 의미가 없다 따라서 몫을 저장하는 identifier-3이나 나머지를 저장하는 identifier-4에는 이전에 저장되어 있던 값이 그대로 유지된다.

    • 나머지에 대해서 size error가 발생할 경우 나머지를 저장하는 identifier-4에는 이전에 저장되어 있던 값이 그래로 유지된다.

  • END-DIVIDE phrase

    • END-DIVIDE phrase은 명시적으로 DIVIDE phrase의 범위를 지정하는 데 사용된다.

format 1, 2, 3에는 데이터 항목으로 floating-point를 사용할 수 있지만 format 4, 5는 floating-point 항목을 사용할 수 없다.

2.11. ENTRY

ENTRY statement는 서브 프로그램을 호출하는 경우 PROGRAM-ID에 지정한 프로그램 이름이나 파일 이름 이외에 별도의 이름으로 서브 프로그램을 호출하기 위해 지정하기 설정하는 입구점(entry point)이다. ENTRY statement는 procedure division에 RETURNING phrase가 지정되어 있거나 nested program에는 지정할 수 없다.

CALL statement에서 ENTRY statement으로 지정된 이름으로 서브 프로그램으로 호출하는 경우 ENTRY statement 바로 다음 구문이 수행된다.

figure pd entry
ENTRY Statement Format
  • literal-1

    • CALL statement에 의해 호출되는 entry 이름으로 Alphanumeric literal을 지정해야 하며, program 이름 규칙에 부합되어야 한다.

    • entry 이름은 프로그램 안에서 유일해야 하며 Figurative constant를 지정해서는 안된다.

    • 해당 프로그램의 다른 entry이름과 중복되서는 안된다.

  • USING phrase

    • USING phrase에 대해서는 CALL을 참고한다.

2.12. EVALUATE

EVALUATE statement는 중첩된 IF statement의 간편한 사용을 제공한다. EVALUATE statement는 다중 조건을 판별할 수 있다. 이어지는 실행은 이 판별의 결과에 따라 달라진다.

figure pd evalute
EVALUATE Statement Format
figure pd phrase1
EVALUATE Statement Format : phrase1
figure pd phrase2
EVALUATE Statement Format : phrase2

다음은 statement의 각 설정 항목에 대한 설명이다.

  • WHEN phrase 앞의 오퍼랜드들

    • 오퍼랜드 하나하나를 selection subjects라고 한다.

    • 오퍼랜드들 전체를 a set of selection subjects라고 한다.

  • WHEN phrase 내의 오퍼랜드들

    • 오퍼랜드 하나하나를 selection objects라고 한다.

    • WHEN phrase에 포함된 오퍼랜드들 전체를 a set of selection objects라고 한다.

  • ALSO

    • Selection subjects 또는 selection objects을 그들의 set 내에서 구분해 준다.

  • THROUGH, THRU

    • 범위를 가진 값을 지정할 때 사용된다.

THRU로 연결된 두 operand는 같은 클래스여야 한다. 각각의 a set of selection objects 내의 selection objects의 개수는 selection subjects의 개수와 같아야 한다. 또한 각각의 a set of selection objects의 selection objects는 a set of selection subjects에서 같은 순서 위치에 있는 selection subjects와 다음 규칙에 맞아야 한다.

  • Selection objects에 나타나는 identifiers, literals, arithmetic expressions은 selection subjects의 오퍼랜드와 비교가 가능한 유효한 오퍼랜드이어야 한다.

  • Selection objects에 나타나는 condition-1, condition-2, TRUE, FALSE는 selection subjects가 conditional expression이나 TRUE, FALSE일 때 사용될 수 있다.

  • ANY는 selection subjects가 어떤 종류라도 관계없다.

Selection subjects와 objects 비교 규칙

Selection subjects와 objects는 다음에 따라 비교가 이루어진다.

  • Selection subjects가 identifier-1, literal-1, arithmetic expression이면 a set of selection objects에서 같은 순서 위치에 있는 selection objects 값과 비교한다. THRU를 포함하지 않으면 EQUAL 비교를 하게 되고, THRU가 있으면 selection subjects가 selection objects의 범위 안에 있는지를 확인하게 된다.

  • Selection subjects가 conditional expression이면 a set of selection objects에서 같은 순서 위치에 있는 selection objects는 conditional expression 또는 TRUE, FALSE 값이 와야 한다. Selection subjects가 참일 때 selection objects가 참이어야 비교가 만족되고, selection objects가 거짓이면 비교가 만족되지 않는다. Selection subjects가 거짓일 때, selection objects가 참이면 비교가 만족되지 않고, selection objects가 거짓이면 비교가 만족된다.

  • expression-1, expression-2이 arithmetic expression이고, object또한 arithmetic expression이면, numeric value를 evaluating하는 rule에 따른다.

  • Selection subjects가 TRUE면 a set of selection objects에서 같은 순서 위치에 있는 selection objects는 conditional expression 또는 TRUE, FALSE 값이 와야 한다. Selection objects의 conditional expression이 참이거나 TRUE 이면 해당 비교는 참이 되어 만족된다. Selection objects가 FALSE이면 해당 비교는 만족되지 못한다.

  • Selection subjects가 FALSE이면 a set of selection objects에서 같은 순서 위치에 있는 selection objects는 conditional expression 또는 TRUE, FALSE값이 와야 한다. Selection objects의 conditional expression이 거짓이거나 FALSE이면 해당 비교는 만족된다. Selection objects가 TRUE이면 해당 비교는 만족되지 못한다.

  • Selection objects에 ANY가 오게 되면 비교는 무조건 만족된다.

  • NOT이 selection object에 오게 될 경우, subject와 not equal 연산을 수행한다.

  • A set of selection subjects의 모든 selection subjects와 a set of selection objects의 모든 selection objects에 대해 비교가 만족되면 해당 WHEN phrase를 만족하게 된다.

    만족하지 않으면 다음 WHEN phrase에 대해 비교를 하게 된다.

    • 만족되는 WHEN phrase가 있으면 해당 phrase에 기술된 imperative-statement-1의 구문들이 실행된다.

    • 만족되는 WHEN phrase가 없을 때 WHEN OTHER phrase가 있으면 imperative-statement-2의 구문들이 실행된다. WHEN OTHER phrase가 없으면 해당 EVALUATE statement다음 구문을 실행하게 된다.

2.13. EXIT

EXIT statement는 procedure의 마지막을 의미한다. EXIT statement는 프로그램 내에서 CONTINUE statement와 같은 역할을 수행한다. EXIT statement 다음에 나오는 문장들을 수행한다.

figure pd exit
EXIT Statement Format

2.14. EXIT PARAGRAPH

EXIT PARAGRAPH statement는 현재 수행 중인 paragraph를 종료하고 프로그램의 제어를 다음 procedure로 전달한다.

figure pd exit paragraph
EXIT PARAGRAPH Statement Format

2.15. EXIT PROGRAM

EXIT PROGRAM statement는 호출된 프로그램을 종료하고 호출한 프로그램으로 프로그램의 제어가 넘어간다. EXIT PROGRAM statement는 프로그램의 Procedure Division 내에서만 사용 가능한다.

figure pd exit program
EXIT PROGRAM Statement Format

다음은 메인 프로그램과 서브 프로그램에서 EXIT PROGRAM statement의 동작 순서이다.

  1. 메인 프로그램에서 CALL statement로 서브 프로그램을 호출한다.

  2. 서브 프로그램이 수행 중에 EXIT PROGRAM statement를 만나게 되면 프로그램의 제어는 CALL statement로 넘어가게 된다.

  3. 그러면 메인 프로그램의 CALL statement의 다음 문장을 수행한다.

EXIT PROGRAM statement는 프로그램의 제어가 이동하므로 EXIT PROGRAM은 가장 마지막에 있어야한다. 서브 프로그램에서 더 이상 수행할 문장이 없는 경우에는 묵시적으로 EXIT PROGRAM statement가 수행된다.

2.16. GOBACK

GOBACK statement는 서브 프로그램 내에서는 프로그램의 제어를 메인 프로그램으로 전달하고 메인 프로그램에서는 프로그램을 종료하는 기능을 수행한다. 서브 프로그램에서의 EXIT PROGRAM statement나 메인 프로그램의 STOP RUN과 동일한 기능을 수행한다. GO BACK statement는 서브 프로그램에서 논리적으로 프로그램의 마지막이라는 것을 의미한다.

figure pd goback
GOBACK Statement Format

서브 프로그램에서 GO BACK statement를 만나게 되면, 프로그램의 제어는 메인 프로그램으로 이동하게 된다. 따라서, GO BACK statement는 단독으로 사용하거나 서브 프로그램의 가장 마지막에 위치해야 한다. 서브 프로그램내에서 GO BACK statement 이후의 statement는 수행되지 않는다.

메인 프로그램에서 CALL statement를 이용하여 서브 프로그램을 호출하였을 경우, 서브 프로그램에서 GO BACK statement를 처리한 후에는 메인 프로그램의 CALL statement 바로 다음 statement로 프로그램의 제어가 이동하게 된다.

2.17. GO TO

GO TO statement는 프로그램의 제어를 Procedure Division 내의 다른 위치로 전달한다.

GO TO statement에는 다음과 같이 2가지 타입이 있다.

  • 비조건 GO TO(unconditional GO TO statement)

  • 조건 GO TO(conditional GO TO statement)

비조건 GO TO(unconditional GO TO statement)

비조건 GO TO statement는 프로그램의 제어를 procedure-name-1으로 정의된 paragraph나 section으로 이동한다.

GO TO statement를 만나게 되면 프로그램의 다른 procedure나 section으로 프로그램의 제어가 이동하므로 GO TO statement 다음에 나오는 문장은 수행되지 않을 수도 있다.

figure pd goto format1 unconditional
GOTO Statement Format 1
항목 설명

procedure-name-1

프로그램의 제어가 이동할 procedure 이름이나 section 이름이다.

조건 GO TO(conditional GO TO statement)

조건 GO TO statement는 procedure-name-1 리스트가 있을 때 identifier-1의 값에 따라 리스트 중에서 프로그램의 제어가 이동할 procedure-name이 결정되는 statement이다.

figure pd goto format2 conditional
GOTO Statement Format 2
항목 설명

procedure-name-1

GO TO statement와 동일한 Procedure Division 내에 있는 procedure 또는 section이다. Procedure-name-1의 리스트는 255개까지 가능하다.

identifier-1

integer로된 numeric이어야 한다.

Identifier-1은 windowed 데이터 필드가 될 수 없다. Identifier-1이 1인 경우에는 procedure-name list의 첫 번째 procedure로 GO TO하게 되며, identifier-1이 2인 경우에는 procedure-name list의 두 번째 procedure로 GO TO하게 된다.

만약, identifier-1의 값이 procedure-name list의 갯수를 초과한 경우에는 GO TO statement는 의미가 없어지며 GO TO statement 다음의 statement가 수행된다.

2.18. IF

IF statement는 조건을 판정하여 그 결과에 따라서 작업을 제공한다.

figure pd if
IF Statement Format

다음은 statement의 각 설정 항목에 대한 설명이다.

  • condition-1

  • statement-1, statement-2

    • 조건에 따라 수행될 statement들을 기술한다. 조건이 참이면 THEN phrase의 statement-1에 기술된 statement들이 실행되거나 NEXT SENTENCE에 의해 처리되고, 거짓이면 ELSE phrase의 statement-2에 기술된 statement가 실행되거나 NEXT SENTENCE에 의해 처리된다.

    • 이곳에 IF statement을 사용함으로써 중첩된 IF statement 사용이 가능해진다. 중첩된 IF statement에서는 IF, ELSE, END-IF를 통해 매칭이되는 IF문을 확인한다. END-IF는 가장가까운 IF문과 매칭된다.

  • NEXT SENTENCE

    • 점(.) 다음의 sentence를 실행한다.

    • END-IF와 함께 기술된다 해도 END-IF 다음 statement가 실행되는 것은 아니라 가장 가까운 점 다음 statement가 실행된다.

  • END-IF phrases

    • IF 문의 끝을 나타낸다.

2.19. INITIALIZE

INITIALIZE statement는 identifier-1에 기술한 데이터 카테고리에 따라 특정 값을 identifier-1에 설정하거나 REPLACING phrase가 지정되어 있는 경우는 identifier-2 또는 literal-1의 값을 identifier-1에 설정하는 구문이다. 기능적으로 한개 혹은 이상의 MOVE statement와 동일하다.

figure pd initialize
INITIALIZE Statement Format

다음은 statement의 각 설정 항목에 대한 설명이다.

  • identifier-1

    • RENAMES CLAUSE를 가져서는 안된다.

    • 값이 설정되는 receiving area로 다음과 같은 항목을 지정할 수 있다.

      항목 설명

      그룹 항목

      Alphanemeric 데이터가 올 수 있다. REPLACING phrase가 있을 때 identifier-1이 alphanumeric group 항목일 경우 identifier-1의 하부 element 항목들은 REPLACING 절의 규칙에 따라 initialized 된다.

      elementary 데이터 항목

      Alphabetic, Alphanumberic, Alphanumeric-edited, DBCS, numeric, numeric-edited, internal/external floating-point의 카테고리에 속하는 데이터 항목이다.

  • identifier-2, literal-1

    • MOVE 또는 SET statement에서 sending area에 지정가능한 elementary 데이터 항목이나 literal을 지정할 수 있다.

      identifier-1, identifier-2에 특수 레지스터를 지정하는 경우는 각각 MOVE statement에서 receiving area 또는 sending area로 지정이 가능해야 한다.

  • REPLACING phrase

    • REPLACING phrase에 지정한 데이터 카테고리와 identifier-1의 카테고리가 동일한 경우 identifier-2 또는 literal-1의 값이 identifier-1에 설정된다.

    • Floating-point 항목의 경우 NUMERIC 카테고리로 취급된다.

    • REPLACING phrase에 동일한 카테고리를 중복해서 지정해서는 안된다.

identifier-1, identifier-2, REPLACING phrase에 지정한 카테고리에 사이의 유효성은 내부적으로 체크하지 않는다. 따라서 사용자가 MOVE 또는 SET규칙에 맞는 데이터 항목 및 카테고리를 지정해야 한다.

다음은 REPLACING pharse가 지정되지 않은 경우 identifier-1에 설정되는 값에 대한 설명이다.

  • identifier-1의 카테고리가 alphabetic, alphanumeric, alphanumeric-edited, DBCS인 경우는 Figurative constant space가 설정된다.

  • identifier-1의 카테고리가 numeric, numeric-edited, external floating-point인 경우는 Figurative constant zero가 설정된다.

  • identifier-1의 카테고리가 pointer인 경우는 Figurative constant null이 설정된다.

2.20. INSPECT

INSPECT statement는 문자열 혹은 문자열의 그룹을 examine하여 다음과 같은 일을 수행한다.

  • 문자열 내 특정 character의 출현 빈도를 센다. (format 1,3)

  • 문자열 내 특정 character의 출현 빈도를 세고, 명시한 character로 채운다. (format 2,3)

  • 특정 문자를 치환한다.

figure pd inspect format1
INSPECT Statement Format 1
figure pd inspect format1 phrase1
INSPECT Statement Format 1 : phrase
figure pd inspect format2
INSPECT Statement Format 2
figure pd inspect format2 phrase1
INSPECT Statement Format 2 : phrase
figure pd inspect format3
INSPECT Statement Format 3
figure pd inspect format3 phrase1
INSPECT Statement Format 3 : phrase
figure pd inspect format4
INSPECT Statement Format 4

다음은 statement의 각 설정 항목에 대한 설명이다.

  • identifier-1

    • Alphanemeric Group Item 혹은 elementary 항목이면서 USAGE DISPLAY, DISPLAY-1인 항목 또는 Alphanemeric type의 special register가 올 수 있다.

    • USAGE만 맞다면, 데이터는 어떤 카테고리여도 상관없다.

  • identifier-3, identifier-4, identifier-5, identifier-6, identifier-7

    • elementary 항목이면서 USAGE DISPLAY, DISPLAY-1이어야 한다.

  • literal-1, literal-2, literal-3, literal-4

    • alphanumeric, DBCS literal이어야 한다. 각각의 리터럴은 identifier-1과 카테고리가 같아야만 한다.

    • identifier-1이 usage DISPLAY면, ALL이아닌 다른 figurative constant가 올수 있다.

identifier-2를 제외한 모든 identifier들은 identifier-1과 같은 USAGE 타입을 가져야 한다.

  • TALLYING phrase (format 1, 3)

    • TALLYING phrase는 지정한 character의 출현 빈도를 센다.

    • identifier-2는 COUNT field로, PICTURE에 P를 포함하지 않는 elementary integer 항목이어야 한다. identifier-3, literal-1는 tallying field이다.

      항목 설명

      CHARACTERS

      space를 포함한 모든 identifier-1 항목의 character에대해 count field인 identifier-2가 1씩 증가한다.

      ALL

      identifier-1 항목의 character에 대해 identifier-3 or literal-1과 비교하여 일치하는경우 중첩되지 않는 출현 빈도에 따라 identifier-2를 1씩 증가시킨다. leftmost character position에서 시작하여 rightmost position 으로 진행한다.

      LEADING

      identifier-1 항목의 character에 대해 identifier-3 or literal-1과 비교하여 일치하는경우 중첩되지 않는 연속된 출현 빈도에 따라 identifier-2를 1씩 증가시킨다. leftmost character position에서 첫 번째 출현하는 위치에서 시작하여 연속된 출현 빈도수 만큼 비교한다.

  • REPLACING phrase (format 2, 3)

    • REPLACING phrase는 데이터 항목의 특정 문자열을 치환한다.

    • identifier-3, literal-1은 대체가되는 subject 항목이다. identifier-5, literal-3는 subject를 대체하는 substitution 항목이다. subject와 substitution 항목은 길이가 같아야 한다.

      항목 설명

      CHRACTERS BY

      substitution 항목이 subject 항목의 각 캐릭터를 replace한다. leftmost에서 rightmost로 진행한다. substitution 항목은 길이가 1 이어야 한다.

      ALL

      substitiution 항목이 subject의 항목을 중첩되지 않는 출현 빈도에따라 replace한다. leftmost character position에서 시작하여 rightmost position 으로 진행한다.

      LEADING

      substitiution 항목이 subject의 항목을 중첩되지 않는 연속된 출현 빈도에따라 replace한다. leftmost character position에서 첫 번째 출현하는 위치에서 시작하여 연속된 출현 빈도수 만큼 비교한다.

      FIRST

      leftmost의 일치하는 character만큼 replace가 일어난다.

  • Replacement Rule

    • 다음의 replacement rule이 적용된다.

      • subject field가 figurative constant면, fugurative constant와 일치하는 각 character들에 대해 replace가 일어난다.

      • figurative constant나 character string이 subject일 때 replace는 중첩되지 않는 출현빈도에 따라 진행된다.

  • BEFORE and AFTER phrases (all format)

    • identifier-4, literal-2는 delimiter이다. delimiter는 counter에 포함되지 않고, replace되지도 않는다.

    • INITIAL은 지정된 항목의 첫 번째 출현을 나타낸다.

      항목 설명

      BEFORE

      counting이나 replacing이 leftmost부터 delimiter와 일치하는 첫 번째 position까지 진행한다. delimiter와 일치하는 position이 없다면 rightmost까지 진행한다.

      AFTER

      counting이나 replacing이 delimiter와 일치하는 첫 번째 position의 오른쪽부터 rightmost까지 진행한다. delimiter와 일치하는 position이 없다면 counting이나 replace는 일어나지않는다.

  • CONVERTING phrase (format 4)

    • 지정된 replacing characters로 모든 데이터 항목의 characters을 변환한다.

    • identifier-6, literal-4는 변환될 character string을 지정한다. identifier-7, literal-5는 변환을 할 character string을 지정한다. replaced string과 replacing string은 길이가 같아야 한다.

2.21. MERGE

MERGE statement는 정렬된 파일들을 병합한다. 각 파일의 레코들은 KEY에 의해 정렬이 되어 있어야 한다.

figure pd merge
MERGE Statement Format

다음은 statement의 각 설정 항목에 대한 설명이다.

  • file-name-1

    • SD entry에 기술된 이름이다.

  • ASCENDING KEY and DESCENDING KEY phrases

    • merge key가 오름차순인지 내림차순인지를 지정한다.

      항목 설명

      data-name-1

      MERGE statement에서 사용될 KEY 데이터 항목을 기술한다. data-name-1은 file-name-1에 대한 레코드에 포함된 데이터 항목이어야 한다.

      데이터 항목이 기술된 순서에 따라 왼쪽부터 중요도가 높은 키가 된다. 즉, 처음 기술된 데이터 항목이 가장 중요한 KEY가 되고, 그 다음 나오는 데이터 항목이 그 다음 중요한 키가 된다.

      • KEY 데이터 항목은 각 입력 파일에 대해서 물리적으로 같은 위치에 있어야 하고 data format도 같아야 한다. data-name이 같을 필요는 없다.

      • file-name-1이 하나 이상의 레코드가 기술되어 있다면 KEY 데이터 항목은 그중 하나의 레코드에 기술될 필요가 있다.

      • KEY 데이터 항목은 OCCURS clause를 포함할 수 없고 OCCURS를 포함한 item에 종속될 수 없다.

      • KEY 데이터 항목은 qualified될 수 있다.

        KEY 데이터 항목은 다음 데이터 범주 중 하나가 된다.

        • Alphabetic, alphanumeric, alphanumeric-edited

        • Numeric

        • Numeric-edited (with usage DISPLAY)

        • Internal floating-point or display floating-point

  • COLLATING SEQUENCE phrase

    • MERGE statement 동작에서 key data 항목에 대한 alphanumeric 비교에 사용되는 조합 순서를 지정한다.

      항목 설명

      alphabet-name-1

      반드시 SPECIAL-NAMES paragraph 의 ALPHABET clause에 정의되어 있어야 한다.

  • USING phrase

    • 입력 파일들을 기술한다.

      항목 설명

      file-name-2,...

      입력 파일들을 정의한다. USING phrase가 사용되면 입력 파일들(file-name-2,...,)의 모든 레코드들이 자동적으로 file-name-1으로 전송된다.

      모든 입력 파일들은 Data division의 FD entries에 기술되어 있어야 한다.

  • GIVING phrase

    • 출력 파일들을 기술한다.

      항목 설명

      file-name-3,...

      출력 파일을 정의한다.

      GIVING phrase가 기술되면 모든 정렬된 레코드들은 자동적으로 출력 파일로 전송된다. 모든 출력 파일들은 Data division의 FD entries에 기술되어 있어야 한다.

  • OUTPUT PROCEDURE phrase

    • 병합 작업을 수행한 후 출력 레코드를 선택하고 수정하는 procedure 이름을 기술한다.

      항목 설명

      procedure-name-1

      OUTPUT PROCEDURE의 첫 번째(또는 유일한) section이나 paragraph를 기술한다.

      procedure-name-2

      OUTPUT PROCEDURE의 마지막 section이나 paragraph를 기술한다.

    • OUTPUT PROCEDURE에는 RETURN statement가 있어 한 번에 하나의 레코드를 file-name-1이 참조하는 파일로부터 전송받는다. 이외에 다양한 구문(OPEN, WRITE, CLOSE, ...)을 사용함으로써 출력 레코드를 선택, 복사, 수정할 수 있다.

MERGE statement가 실행되면 file-name2, file-name3,...에 포함된 모든 레코드들이 기술된 KEY에 따라서 병합된다.

2.22. MOVE

MOVE statement는 특정 메모리 영역을 한개 혹은 여러 개의 다른 메모리 영역으로 복사한다.

MOVE statement의 기술 형식은 아래와 같이 2가지 형식이 있다.

  • Format 1

    figure pd move format1
    MOVE Statement Format 1
  • Format 2

    figure pd move format2
    MOVE Statement Format 2

다음은 statement의 각 설정 항목에 대한 설명이다.

  • identifier-1, literal-1

    • identifier-1, literal-1은 sending area라고 한다.

  • identifier-2

    • identifier-2는 receiving area라고 하며 intrisinc function은 지정할 수 없다.

      구분 설명

      format 1

      identifier-1에는 alphanumeric그룹 항목이나 elementary 항목을 지정할 수 있다.

      identifier-2가 여러 개 기술되어 있는 경우는 지정된 순서에 따라 identifier-2에서 identifier-1으로 복사된다.

      format 2

      identifier-1과 identifier-2는 모두 그룹 항목이어야 한다.

      identifier-1의 특정 항목이 CORRESPONDING 규칙에 따라 identifier-2에 복사된다.

    • receiving field(identifier-2)의 길이, subscripting, reference-modification은 데이터가 해당 receiving field로 이동하기 직전에 평가된다.

  • CORR은 CORRESPONDING의 약어이다.

  • usage phrase

    INDEX, POINTER, FUNCTION-POINTER, PROCEDURE-POINTER가 지정된 항목은 elementary 항목으로 identifier-1과 identifier-2에 지정할 수 없다.

MOVE CORRESPONDING statement 형식에서는 INDEX, POINTER, FUNCTION-POINTER, PROCEDURE-POINTER가 지정된 항목이 alphanumeric 그룹 항목의 멤버로 지정될 수 있다. 단, 해당 항목에 대해서는 실제 데이터 영역 복사는 이루어지지 않는다. sending 항목이나 receiving 항목의 길이는 DEPENDING ON phrase에 의해 결정된다.

identifier-1이 reference-modified, subscript를 가지고 있거나 Alphanumeric function-identifier인 경우 identifier-2의 첫 번째 항목에 복사가 이루어지기 전에 identifier-1의 reference-modified, subscript, alphanumeric function-identifier 평가(evaluation)가 이루어진다. sending area와 receiving are가 overlapping되는 경우 결과는 보장할 수 없다.

Elementary move

receiving 항목이 elementary 데이터 항목이고 sending 항목은 elementary 데이터 항목이거나 문자열인 경우 Element move라고 한다.

sending 항목과 receiving 항목에 기술 가능한 데이터 카테고리는 다음 중 하나가 될 수 있다.

  • 지정 가능한 데이터 카타로그 또는 리터럴

  • alphabetic 카테고리의 데이터 항목, SPACE

  • alphanumeric 카테고리 데이터 항목, alphanumeric function, alphanumeric literal, ALL alphanumeric-literal, figurative constant(NULL 제외)

  • alphanumeric-edited 카테고리 데이터 항목

  • DBCS 카테고리 데이터 항목, DBCS literal, ALL DBCS-literal

  • External floating-point 카테고리 데이터 항목, floating-point literal

  • internal floating-point 카테고리 데이터 항목

  • numeric 카테고리 데이터 항목, numeric literal, ZERO

  • numeric-edited 카테고리 데이터 항목

receiving 항목이 아래와 같을 때 다음과 같은 규칙이 적용된다. Alignment 규칙은 PICTURE clause의 설명을 참고한다.

  • Alphabetic

    • 데이터 변환(conversion)은 발생하지 않는다.

    • Alignmet 규칙에 따라, 데이터 alignmet가 이루어지며 공백으로 padding또는 데이터 truncation이 발생한다.

    • sending 항목의 길이가 receving 항목과 다른 경우 receving 항목에 JUSTIFIED cluase이 기술에 따라 truncation이 되어진다. 기본적으로는 right truncation이 적용된다. 자세한 내용은 JUSTIFIED clause를 참고한다.

  • Alphanumeric 또는 alphanumeric-edited

    • Alignment 규칙에 따라 데이터 alignment가 이루어지며 공백으로 padding 또는 데이터 truncation이 발생한다.

    • sending 항목의 길이가 receiving 항목의 길이보다 큰 경우는 sending 항목의 오른쪽에서 부터 초과되는 문자만큼이 truncation된다.

    • 최초에 sending 항목이 부호를 가지고 있었다면 부호없는 값을 사용한다. 만약 부호가 별도의 메모리 공간을 차지하는 경우는 부호 문자는 복사되지 않으며 sending 항목의 길이는 부호가 차지하는 길이를 뺀 길이가 된다.

  • DBCS

    • 데이터 변환은 일어나지 않는다.

    • sending 항목과 receiving 항목의 길이가 다른 경우는 sending 항목의 오른쪽부터 truncation이 되거나 DBCS space로 padding이 일어난다.

  • External floating-point

    • sending 항목이 floating-point인 경우 floating-point 값은 receiving 항목에 지정된 usage에 맞게 변환되어 복사된다.

    • sending 항목이 floating-point가 아닌 경우 numeric 값은 internal floating-point로 변경되어 receiving 항목의 usage에 맞게 변환되어 복사된다.

  • Internal floating-point

    • sending 항목이 internal floating-point가 아닌 경우는 sending 항목의 값을 internal floating-point 형식으로 변환하여 복사한다.

  • numeric 또는 Numeric-edited

    • Alignment 규칙에 따라 decimal point aligment가 이루어지거나 zero에 의한 padding이 발생한다.

    • receiving 항목이 signed 항목인 경우 sending 항목의 부호 기호는 receiviing 항목의 부호위치에 위치하게 된다. 만약 sending 항목이 unsigned 항목인 경우는 양의 부호(+)가 생성되어 receiving 항목의 부호 위치에 위치하게 된다.

    • sending 항목이 alphanumeric, alphanumeric-edited 항목인 경우 sending 항목은 unsiged integer 데이터로 복사가 이루어진다.

    • sending 항목이 floating-point인 경우 receving 항목의 picture phrase에 맞게 fixed-decimal point 형식으로 변환된 후에 복사된다.

    • receiving 항목이 numeric edited 항목인 경우, picture phrase에 지정된 형식에 따라 sending 항목의 편집이 발생하게된다.

    • sending 항목이 numeric-edited 항목인 경우 편집 기호들을 제외한 numeric literal 값만을 receiving 항목에 복사한다. 만약 receiving 항목도 numeric-edited인 경우는 receiving 항목의 picture phrase에 지정된 편집 기호에 맞게 데이터가 복사된다.

    • receiving 항목의 카테고리가 alphanumeric, alphanumeric-edited, numeric-edited이고 sending 항목이 numeric이면, sending 항목의 picture phrase에 지정된 P위치에는 0이 지정되어 있는 것으로 간주한다.

다음은 카테고리별로 유효한 데이터 항목에 대한 설명이다.

  • 가장 위쪽의 컬럼은 receiving 항목의 카테고리를 나타낸다.

  • 가장 왼쪽의 컬럼은 sending 항목의 카테고리를 나타낸다.

Alphabetic Alphanumeric Alphanumeric- edited Numeric Numeric- edited External floating- point Internal floating- point DBCS

Alphabetic and SPACE

O

O

O

X

X

X

X

X(+)

Alphanumeric and alphanumeric literal

O

O

O

O(*)

O(*)

O(*)

O(*)

X

Alphanumeric-edited

O

O

O

X

X

X

X

X

Numeric integer, ZERO and integer numeric literal

X

O

O

O

O

O

O

X

Numeric noninteger and noninteger numeric literal

X

X

X

O

O

O

O

X

Numeric-edited

X

O

O

O

O

O

O

X

Floating-point(floating-point literal, external floating-point data items and internal floating-point data items)

X

X

X

O

O

O

O

X

DBCS

X

X

X

X

X

X

X

O

(*) Figurative constants와 alphanumetic literal은 숫자로만 구성되어 있어야 한다.

(+) Figurative constant space는 가능하다.

Group move

Group move는 alphanumeric 그룹 항목이 sending 혹은 receiving 항목이거나 sending과 receiving 항목이 모두 그룹 항목인 경우를 말한다. Group move는 alphanumeric 항목에서 alphanumeric에서 alphanumeric elementary 항목으로 데이터 복사하는 것과 동일하게 데이터 복사를 한다. 단, 데이터 변환은 이루어지지 않는다.

  • alphanumeric 그룹 항목이 receiving 항목인 경우 sending 항목은 다음과 같은 항목이 올 수 있다.

    • 유효한 elementary 데이터 항목

    • 문자열이나 숫자 상수

    • Figurative constant

  • sending 항목이 alphanumeric 그룹 항목인 경우 receiving 항목은 다음과 같은 항목이 올 수 있다.

    • 유효한 elementary 데이터 항목

    • alphanumeric 그룹 항목

2.23. MULTIPLY

MULTIPLY statement는 numeric item을 곱해서 그 결과 값을 지정한 데이터 항목에 저장하는 구문이다.

  • Format 1

    Format 1은 identifier-1 또는 literal-1을 identifier-2와 곱해서 그 결과 값을 identifier-2에 저장한다.

    identifier-2가 여러 개 지정되어 있는 경우는 왼쪽에서 오른쪽으로 identifier-1또는 literal-1과 곱하기 연산을 반복해서 실행해서 그 결과 값을 identifier-2에 저장한다.

    figure pd multiply format1
    MULTIPLY Statement Format 1
  • Format 2

    Format 2는 identifier-1 또는 literal-1의 값을 idetifier-2와 곱해서 그 결과값을 identifier-3에 저장한다.

    figure pd multiply format2
    MULTIPLY Statement Format 2

다음은 statement의 각 설정 항목에 대한 설명이다.

  • identifier-1, identifier-2

    • identifier-1과 identifier-2는 elementary numeric, floating-point 데이터 항목이어야 한다.

  • literal-1, literal-2

    • literal-1과 literal-2는 문자 상수 혹은 floating-point이어야 한다.

  • identifier-3

    • identifier-3은 elementary numeric 데이터 항목이나 elementary numeric-edited 데이터, floating-point 데이터 항목이어야 한다.

  • ROUNDED phrase

  • SIZE ERROR phrase

  • END-MULTIPLY phrase

    • END-MULTIPLY phrase는 명시적으로 MULTIPLY statement의 끝을 지정한다.

2.24. OPEN

OPEN statement는 파일을 사용가능 하도록 개시한다.

  • Format 1

    figure pd open format1 sequential files
    OPEN Statement Format 1
  • Format 2

    figure pd open format2 indexed and relative files
    OPEN Statement Format 2
  • Format 3

    figure pd open format3 line sequential files
    OPEN Statement Format 3

다음은 statement의 각 설정 항목에 대한 설명이다.

  • INPUT

    • 입력 파일로 open한다.

  • OUTPUT

    • 출력 파일로 open한다.

    • 새로 생성되는 파일에 대하여 사용할 수 있다. 레코드를 포함하고 있는 파일에 대해서 사용하면 파일을 open할 때 기존 레코드는 삭제된다.

  • I-O

    • 입출력 파일로 open한다.

  • EXTEND

    • 기존 레코드에 추가로 덧붙이거나 신규로 파일을 생성할 때 사용되는 출력 파일을 OPEN한다.

    • 파일이 존재하면 기존 레코드의 다음에 레코드를 추가하게 되고, 파일이 존재하지 않으면 새로 생성한다.

  • file-name-1, file-name-2, file-name-3 , file-name-4

    • open될 파일명을 기술한다.

    • 반드시 FD entry에 기술되어 있어야 한다.

  • REVERSED, NO REWIND

    • 테이프 파일에만 적용된다.

General rules

OPEN INPUT 또는 OPEN I-O statement는 file posiotion indicator를 첫 번째 레코드 위치에 설정한다.

EXTEND phrase가 기술되어 있으면 파일의 마지막 레코드 다음에 위치시킨다. 이어지는 WRITE statement는 OUTPUT으로 open된 것처럼 레코드를 추가한다. EXTEND phrase는 새로 생성되는 파일에 대해서도 기술할 수 있다.

VSAM 파일에 대하여 파일에 레코드가 존재하지 않는다면 Format 1의 READ statement의 실행 결과가 AT END condition이 발생하도록 file posiotion indicator가 설정된다.

다음의 표들은 OPEN mode와 사용 가능한 입출력 statement들과의 관계를 보여준다.

  • Permissible statements for sequential files

    Statement Input open mode Output open mode I-O open mode Extend open mode

    READ

    X

    X

    WRITE

    X

    X

    REWRITE

    X

  • Permissible statements for indexed and relative files

    File access mode Statement Input open mode Output open mode I-O open mode Extend open mode

    Sequential

    READ

    X

    X

    WRITE

    X

    X

    REWRITE

    X

    START

    X

    DELETE

    X

    Random

    READ

    X

    X

    WRITE

    X

    X

    REWRITE

    X

    START

    DELETE

    X

    Dynamic

    READ

    X

    X

    WRITE

    X

    X

    X

    REWRITE

    X

    START

    X

    X

    DELETE

    X

  • Permissible statements for line-sequential files

    Statement Input open mode Output open mode I-O open mode Extend open mode

    READ

    X

    WRITE

    X

    X

    REWRITE

X 표시가 된 곳이 statement가 허용된 곳이다.

2.25. PERFORM

PERFORM statement는 프로그램 실행 중에 프로그램의 제어를 명시적으로 하나 이상의 다른 procedure로 넘길때 사용하는 statement이다. PERFORM으로 제어가 넘어간 위치에서 procedure가 종료되면 프로그램의 제어는 PERFORM statement 다음으로 넘어가게 된다.

PERFORM statement를 사용하는 방식에는 다음과 같은 2가지 방식이 있다.

  • out-of-line PERFORM statement

    out-of-line PERFORM statement는 PERFORM statement 안에 statement를 기술하는 것이 아니라 기술되어 있는 procedure를 호출하는 방식이다. 따라서, 처리할 procedure name을 반드시 지정해야 한다.

  • in-line PERFORM statement

    in-line PERFORM statement는 procedure-name을 지정하지 않고 PERFORM statement 내에 statment를 직접 사용한 경우를 말한다. 따라서, statement의 끝을 표현하기 위해서 END-PERFORM phrase를 반드시 지정해야 한다.

PERFORM statement에는 다음과 같은 4가지 유형이 있다.

Basic PERFORM statement

PERFORM statement의 가장 기본이 되는 유형으로 PERFORM에서 호출한 procedure를 한 번 실행하는 statement이다. PERFORM에서 호출한 procedure가 종료되면 PERFORM statement 이후의 statement가 순서대로 처리된다. 단, PERFORM statement에서 자기 자신의 procedure를 호출해서는 안된다.

figure pd perform format1
Basic PERFORM Statement Format

다음은 statement의 각 설정 항목에 대한 설명이다.

  • procedure-name-1, procedure-name-2

    • procedure-name-1과 procedure-name-2는 모두 Procedure division 내에서 사용하는 procedure name이어야 한다.

    • procedure-name1과 2 모두 사용되는 경우, 둘 중 하나가 declarative procedure내에 정의된 procedure라면, 나머지 하나또한 declarative procedure 내에 정의된 procedure이어야 한다.

    • procedure-name-1이 사용된 경우 imperative-statement-1과 END-PERFORM을 지정할 수 없다.

    • procedure-name-1을 생략한 경우 imperative-statement-1과 END-PERFORM을 반드시 지정해야 한다.

  • imperative-statement-1

    • PERFORM에 의해서 실행될 statement이다.

프로그램을 실행할 때 out-of-line PERFORM statement를 만나게 되면 프로그램의 제어는 procedure-name-1의 첫 번째 statement로 넘어간다. 그리고 procedure-name-1이 모두 수행이 되면 프로그램의 제어는 PERFORM statement 다음의 statement로 제어가 넘어간다.

procedure를 수행한 후 리턴하는 시점은 다음과 같다.

  • procedure-name-1이 paragraph이고 procedure-name-2는 지정하지 않은 경우 procedure-name-1의 마지막 statement를 수행한 후 PERFORM statement로 리턴한다.

  • procedure-name-1이 section이고 procedure-name-2는 지정하지 않은 경우 procedure-name-1 section내의 마지막 paragraph의 마지막 statement를 수행한 후 PERFORM statement로 리턴한다.

  • procedure-name-2가 pargraph인 경우 procedure-name-2 paragraph의 마지막 statement를 실행한 후 리턴한다.

  • procedure-name-2가 section인 경우 procedure-name-2 section 내의 마지막 paragraph의 마지막 statement를 수행한 후 리턴한다.

procedure-name-1과 procedure-name-2를 모두 지정한 경우에는 PERFORM은 procedure-name-1에서 시작해서 procedure-name-2까지 수행한다. 따라서, 프로그램의 순서 역시 procedure-name-1이 먼저 나오고 procedure-name-2가 이후에 나와야 한다.

PERFORM statement는 PERFORM statement에 의해 실행된 프러시저 안에 나올 수 있다.

TIMES phrase를 사용하는 PERFORM statement

PERFORM statement의 두 번째 유형은 TIMES phrase에 지정한 identifier나 integer 횟수만큼 프러시저를 호출하거나 imperative-statement를 실행하는 유형이다.

PERFORM statement가 종료하게 되면 프로그램의 제어는 PERFORM statement 다음 문장으로 넘어간다. procedure-name-1을 지정한 경우 imperative-statement-1과 END-PERFORM이 나올 수 없다.

figure pd perform format2
TIME phrase를 사용하는 PERFORM Statement Format

다음은 statement의 각 설정 항목에 대한 설명이다.

  • identifier-1

    • integer 항목을 가르켜야 한다.

    • identifier-1이 양수가 아닌 0이나 음수인 경우에는 PERFORM statement는 수행되지 않고 PERFORM statement 다음 문장이 수행된다.

    • PERFORM statement가 수행된 후에는 identifier-1을 변경하더라도 프러시저의 실행 횟수는 바뀌지 않는다.

  • integer-1

    • 양의 정수이여야 한다.

PERFORM with UNTIL phrase

PERFORM statement의 3번째 유형은 UNTIL phrase가 TRUE가 될 때까지 procedure나 imperative-statement를 실행하는 유형이다.

UNTIL phrase에서 지정한 조건이 TRUE인 경우에는 프로그램의 제어는 PERFORM statement의 다음 문장으로 넘어간다. procedure-name-1을 지정한 경우 imperative-statement-1과 END-PERFORM를 지정할 수 없다.

figure pd perform format3
UNTIL phrase를 사용하는 PERFORM Statement Format
figure pd perform format3 phrase1
UNTIL phrase를 사용하는 PERFORM Statement Format : phrase

다음은 statement의 각 설정 항목에 대한 설명이다.

  • condition-1

    • OFCOBOL에서 사용하는 모든 조건이 될 수 있다.

    • 해당 문장의 조건이 true가 되면 PERFORM statement는 수행하지 않는다.

TEST BEFORE phrase를 지정한 경우 statement를 수행하기 전에 해당하는 조건을 체크한다. TEST AFTER phrase를 지정한 경우에는 조건문을 수행하기 전에 최소한 1번은 statement를 실행한다. TEST BEFORE나 TEST AFTER를 지정하지 않은 경우에는 TEST BEFORE phrase가 지정된 것으로 간주한다. condition이 TRUE라면, PERFORM statment의 다음 실행가능한 statement가 실행된다.

PERFORM with VARYING phrase

PERFORM statement의 4번째 유형은 하나 이상의 변수를 이용하여 해당하는 변수를 증가 또는 감소를 시키면서 해당 변수가 지정한 조건이 TRUE가 될 때까지 procedure나 imperative statement를 수행하는 유형이다.

procedure-name-1을 지정한 경우 imperative-statement-1과 END-PERFORM이 나올 수 없다. 만약, procedure-name-1이 생략되면 AFTER phrase를 지정할 수 없다.

figure pd perform format4
VARYING phrase를 사용하는 PERFORM Statement Format
figure pd perform format4 phrase1
VARYING phrase를 사용하는 PERFORM Statement Format : phrase1
figure pd perform format4 phrase2
VARYING phrase를 사용하는 PERFORM Statement Format : phrase2
figure pd perform format4 phrase3
VARYING phrase를 사용하는 PERFORM Statement Format : phrase3

다음은 statement의 각 설정 항목에 대한 설명이다.

  • identifier-2 through identifier-7

    • numeric 데이터 항목이어야 한다.

    • floating-point data item도 가능하다.

  • literal-1 through literal-4

    • numeric literal이어야 한다.

    • floating-point data item도 가능하다.

  • condition-1, condition-2

    • OFCOBOL에서 사용하는 모든 condition이 될 수 있다.

    • 해당 문장의 조건이 TRUE가 되면 PERFORM statement는 수행하지 않는다.

Varying identifiers

TEST BEFORE phrase를 지정하였거나 지정하지 않은 경우에는, statement를 수행하기 전에 해당하는 조건을 체크한다. TEST AFTER phrase를 지정한 경우에는 조건문을 수행하기 전에 최소한 1번은 statement를 실행한다. TEST BEFORE나 TEST AFTER를 지정하지 않은 경우에는 TEST BEFORE phrase가 지정된 것으로 가정한다.

  • Varying Identifier가 1개인 경우

    • identifier-2나 identifier-5가 subscript가 된 경우에는 데이터 항목이 설정되거나 변경될 때마다 값을 계산한다.

    • identifier-3, identifier-4, identifier-6, identifier-7이 subscript된 경우에도 각 데이터 값을 설정하거나 변경할 때마다 값을 계산한다.

    • 다음 그림은 TEST BEFORE phrase를 사용하는 PERFORM statement의 흐름도이다.

      figure pd perform varying1
      TEST BEFORE phrase를 사용한 PERFORM statement 흐름도
    • 다음 그림은 TEST AFTER phrase를 사용하는 PERFORM statement의 흐름도이다.

      figure pd perform varying2
      TEST AFTER phrase를 사용한 PERFORM statement 흐름도
  • Varying Identifier가 2개인 경우

    • 다음과 같은 PERFORM statement가 있다고 하였을 경우 OFCOBOL에서는 아래와 같은 순서로 PERFORM statement를 체크한다.

      figure pd perform varying5

      1. IDENTIFIER-2는 IDENTIFIER-3로, IDENTIFIER-5는 IDENTIFIER-6로 각각 값이 초기화된다.

      2. CONDITION-1의 결과에 따라 다음과 같이 처리한다.

        • CONDITION-1이 TRUE인 경우 PERFORM statement를 종료하고 PERFORM statement 이후의 문장을 수행한다.

        • CONDITION-1이 FALSE인 경우 아래의 3에서 7까지의 STEP을 진행한다.

      3. CONDITION-2의 결과에 따라 다음과 같이 처리한다.

        • CONDITION-2가 TRUE인 경우, IDENTIFIER-2에 IDENTIFIER-4를 더하고, IDENTIFIER-5가 현재 IDENTIFIER-6값으로 설정된다. 그리고 STEP 2가 반복된다.

        • CONDITION-2가 FALSE인 경우 아래의 4에서 6까지의 STEP을 진행한다.

      4. PROCEDURE-NAME-1에서 PROCEDURE-NAME-2까지의 procedure를 실행한다.

      5. IDENTIFIER-5에 IDENTIFIER-7을 더한다.

      6. CONDITION-2가 TRUE가 될 때까지 3에서 5까지의 STEP을 반복한다.

      7. CONDITION-1이 TRUE가 될 때까지 2에서 6까지의 STEP을 반복한다.

        PERFORM statement가 끝났을 때 IDENTIFIER-5는 끝난시점의 IDENTIFIER-6 값을 갖고있는다. IDENTIFIER-2는 가장 마지막에 증가된 또는 감소된 값을 갖게된다.

    • 다음 그림은 TEST BEFORE phrase를 사용하는 PERFORM statement의 흐름도이다.

      figure pd perform varying3
      TEST BEFORE phrase를 사용한 PERFORM statement 흐름도
    • 다음 그림은 PERFORM statement가 TEST AFTER phrase를 갖는 VARYING phrase를 갖는 흐름도이다.

      figure pd perform varying4
      TEST AFTER phrase를 사용한 PERFORM statement 흐름도
  • Varying Identifier가 3개 이상인 경우

    • identifier를 3개 사용하는 PERFORM statement에서의 처리는 identifier를 2개 사용하는 PERFORM statement에서의 처리와 유사하게 동작한다. 단, IDENTIFIER-5가 IDENTIFIER-7만큼 증가할 때 IDENTIFIER-8에 IDENTIFIER-10을 더한 후에 CONDITION-3을 체크하는 과정이 추가된다.

      figure pd perform varying6

    • PERFORM statement가 끝났을 때 IDENTIFIER-5과 IDENTIFIER-8은 끝난 시점의 IDENTIFIER-6과 IDENTIFIER-9 값을 갖게 된다. IDENTIFIER-2는 가장 마지막에 증가되거나 감소된 값을 갖게된다.

    • 3개 이상인 경우 위의 예제에서 AFTER phrase가 추가된 경우를 생각하면 된다.

Varying phrase는 PERFORM statement에서는 identifier의 개수와는 상관없이 다음과 같은 규칙이 적용된다.

  • VARYING이나 AFTER phrase에서 index-name을 명시한 경우

    • index-name에 대한 초기화 및 값을 가감하는 것은 OFCOBOL의 index-name 규칙에 따른다.

    • FROM phrase에서 identifier나 literal은 양의 정수이어야 한다.

    • BY phrase에서 identifier는 정수이어야 하며, literal은 0이 아닌 정수이어야 한다.

  • FROM phrase에서 index-name을 명시한 경우

    • VARYING이나 AFTER phrase에서 identifier는 반드시 정수여야 한다. identifier는 내부적으로 SET statement를 통해 초기화되는 방식으로 초기화된다.

    • BY phrase에서 identifier는 양의 정수이어야 하며 literal은 0이 아닌 정수이어야 한다.

  • BY phrase에서 identifier와 literal은 반드시 0이 아닌 값을 나타내어야 한다.

  • VARYING, FROM이나 BY phrase에서 identifier나 index-name의 값을 변경하는 것은 PERFROM statement의 procedure를 실행하는 횟수를 변경하게 된다.

2.26. READ

READ Statement는 파일로부터 레코드를 읽어오는 동작을 수행한다.

READ statement이 동작하려면 관련된 파일은 반드시 INPUT 또는 I-O mode로 open되어야 한다.

  • Format1

    Sequential access에 대하여 파일로부터 다음 레코드를 읽어온다.

    figure pd read format1 sequential retrieval
    READ Statement Format 1
  • Format 2

    Random access에 대하여 주어진 키에 대한 레코드를 읽어온다.

    figure pd read format2 random retrieval
    READ Statement Format 2

다음은 statement의 각 설정 항목에 대한 설명이다.

  • file-name-1

    • 반드시 Data dvision FD entry에 기술되어 있어야 한다.

  • NEXT RECORD

    • 다음 레코드를 읽는다.

    • Sequential access mode에 대해서는 그 유무에 관계없이 READ statement 수행에는 영향이 없다.

    • Dynamic access mode에서 순차적으로 레코드를 읽기 위해서는 반드시 NEXT RECORD phrase를 기술해야 한다.

  • INTO identifier-1

    • 레코드를 읽어와 받을 필드를 지정한다.

    • identifier-1은 MOVE statement의 규칙에 따라 record-name-1이 sending item 이 될 수 있는 유효한 receiving 항목이어야 한다.

    • identifier-1과 file-name-1은 같은 저장 공간을 참조해서는 안된다.

    • INTO identifier-1는 INTO phrase를 가진 READ statement의 실행 결과는 다음 두 문장을 실행 시킨것과 같다.

      READ file-name-1.
      MOVE record-name-1 TO identifier-1.
  • KEY IS phrases

    • indexed file에만 사용할 수 있다.

    • data-name-1은 반드시 file-name-1과 연관된 파일의 레코드 키를 지정해야 한다. data-name-1은 qualified될 수 있지만 subscripted될 수 없다.

  • AT END phrases

    • Sequential access에서 AT END phrase와 EXCEPTION/ERROR procedure 모두 생략할 수 있다.

  • INVALID KEY phrases

    • INVALID KEY phrase와 EXCEPTION/ERROR procedure 모두 생략할 수 있다.

  • END-READ phrases

    • 명시적으로 READ statement의 끝을 나타낸다.

Multiple record processing

file-name-1에 2개 이상의 레코드가 기술되어 있으면, 그 레코드들은 자동적으로 같은 저장 공간을 공유한다.

Sequential access mode

Format1은 반드시 sequential access mode를 가진 모든 파일에 사용될 수 있다. Format1 READ statement의 실행은 파일에서 다음 레코드를 가져온다.

다음 레코드는 file organization에 따라 결정된다.

  • Sequential files

    • 논리적인 순서에 따라 다음 차례에 있는 레코드를 읽어 온다.

    • NEXT RECORD phrase는 기술할 필요가 없다.

    • AT END condition

      더 이상의 다음 레코드가 없다면 AT END 조건이 발생하고 다음에 따라 처리된다.

      • File-control entry에 FILE STATUS clause가 기술되어 있으면, 결과에 해당하는 값이 file status key에 저장된다.

      • READ statement에 AT END phrase가 기술되어 있으면 imperative-statement-1에 기술된 statements가 실행된다. file-name-1에 관련된 어떠한 USE AFTER STANDARD EXCEPTION procedure도 실행되지 않는다.

      • READ statement에 AT END phrase가 기술되어 있지 않고, 적당한 USE AFTER STANDARD EXCEPTION procedure가 있으면 해당 procedure가 실행된다.

      AT END phrase와 USE AFTER STANDARD EXCEPTION procedure는 둘 다 생략 가능하다.

      AT END phrase가 발생하면 READ statement는 성공하지 못한 것으로 간주되고, 레코드 영역의 내용은 정의할 수 없다. 그리고, file position indicator는 다른 유효한 레코드를 지시하도록 설정되지 않는다.

      AT END condition이 발생하지 않으면 AT END phrase는 무시하고 다음 절차를 따른다.

      1. File-control entry에 FILE STATUS clause가 기술되어 있으면 결과에 해당하는 값이 file status key에 저장된다.

      2. READ statement에 NOT AT END phrase가 기술되어 있으면, imperative-statement-2에 기술된 statements가 실행된다. file-name-1에 관련된 어떠한 USE AFTER STANDARD EXCEPTION procedure도 실행되지 않는다.

      3. READ statement에 AT END phrase가 기술되어 있지 않고, 이 상황에 가능한 USE AFTER STANDARD EXCEPTION procedure가 있으면, 해당 procedure가 실행된다.

  • Indexed or relative files

    • 키의 순서에 따른 다음 레코드를 가져온다. NEXT RECORD phrase를 기술해야 한다.

    • READ statement를 실행하기 전에 OPEN, START 또는 READ statement가 성공적으로 실행되어 file position indicator가 설정되어 있어야 한다.

    • 파일이 sequential access mode로 되어 있으면 NEXT RECORD phrase는 기술할 필요가 없다.

    • 파일이 dynamic access mode로 되어 있으면 순차적으로 레코드를 읽어오기 위해서 NEXT RECORD phrase를 기술해야한다.

    • 더 이상의 다음 레코드가 없다면 AT END condtion이 발생한다.

    • Relative 파일에 대하여 RELATIVE KEY clause가 설정되어 있다면 READ statement의 실행은 읽어온 레코드의 relative key로 RELATIVE KEY 데이터 항목을 갱신한다.

Random access mode

Format2는 random access mode 또는 dynamic access를 가지는 indexed file과 relative file에 기술해야 한다.

  • Indexed files

    • Format 2 READ statement의 실행은 주어진 key에 해당하는 레코드를 찾아 읽어온다. file position indicator은 이 레코드를 지정한다.

    • 주어진 key에 해당하는 레코드가 없으면 INVALID KEY conditon이 발생하고 READ statement의 실행은 실패하게 된다.

    • KEY phrase가 기술되어 있지 않으면, prime RECORD KEY가 READ statement의 실행에서 key로 사용된다. KEY phrase가 기술되어 있으면, data-name-1이 READ statement의 실행에서 key로 사용된다.

  • Relative files

    • Format 2 READ statement의 실행은 RELATIVE KEY 데이터 항목에 포함된 relative record number에 해당하는 레코드를 읽어오고, file position indicator은 이 레코드를 지정한다.

    • 해당하는 레코드가 파일에 없으면 INVALID KEY conditon이 발생하고 READ statement의 실행은 실패하게 된다.

    • Relative files에 대하여 KEY phrase가 기술되어서는 안된다.

Dynamic access mode

Indexed 또는 relative organization인 파일에 대하여 사용될 수 있다. Dynamic access mode에서는 어떤 format의 READ statement를 사용하는가에 따라서 sequential 또는 random하게 레코드를 읽어올수 있다.

순차적으로 레코드를 읽어오기 위해서는 Format 1에 NEXT RECORD phrase를 반드시 기술해야 한다.

2.27. RELEASE

RELEASE statement는 SORT 혹은 MERGE 작업 처리를 시작하기 전에 레코드를 정렬 작업 영역으로 전송한다. SORT 또는 MERGE statement의 INPUT PROCEDURE가 실행되는 영역에만 사용될 수 있다.

INPUT PROCEDURE에는 최소한 1개의 RELEASE statement가 기술되어야 한다.

figure pd release
RELEASE Statement Format

다음은 statement의 각 설정 항목에 대한 설명이다.

  • record-name-1

    • 반드시 DATA DIVISION의 SD entry에 기술된 record-name을 사용해야 한다.

    • record-name-1은 qualified될 수 있다.

    • RELEASE statement이 실행되면 record-name-1의 현재 내용이 정렬 작업 영역으로 옮겨진다.

  • identifiler-1

    • identifier-1은 반드시 다음 중 하나를 참조해야 한다.

      • working-storage section, local-storage section 또는 linkage section의 데이터 항목

      • 이미 open된 다른 파일의 record description

      • alphanumeric function

    • identifier-1은 MOVE statement의 규칙에 따라 record-name-1이 receiving item이 될 수 있는 유효한 sending 항목이어야 한다.

    • identifier-1과 record-name-1은 같은 저장 공간을 참조해서는 안된다.

    • RELEASE statement의 실행 후 identifier-1의 정보는 여전히 유효하다.

FROM identifier-1 phrase를 사용한 RELEASE statement의 실행 결과는 다음 순서로 기술된 구문의 실행 결과와 같다.

MOVE identifier-1 TO record-name-1.
RELEASE record-name-1.

2.28. RETURN

RETURN statement는 SORT 혹은 MERGE 작업 처리 종료 후에 레코드를 정렬 작업 영역에서 OUTPUT PROCEDURE로 전송한다.

SORT 또는 MERGE statement의 OUTPUT PROCEDURE가 실행되는 영역에만 사용될 수 있다.

OUTPUT PROCEDURE에는 최소한 1개의 RETURN statement이 기술되어야 한다.

figure pd return
RETURN Statement Format

다음은 statement의 각 설정 항목에 대한 설명이다.

  • file-name-1

    • 반드시 Data division SD entry에 기술되어 있어야 한다.

    • 한 개 이상의 레코드가 기술되어 있다면, 그 레코드들은 같은 저장 공간을 공유한다. RETURN statement이 실행되면, 오직 현재 레코드만이 유용하다.

  • INTO phrase

    • 전송된 레코드를 identifier-1로 MOVE한다.

  • AT END phrases

    • file-name-1의 모든 레코드들이 RETURN statement에 의해 처리되고 나면 at-end 조건이 발생하여 imperative-statement-1이 실행된다.

    • RETURN statement을 수행하는 동안 at-end 조건이 발생하지 않으면, NOT AT END phrase에 imperative-statement-2를 실행한다.

  • END-RETURN phrase

    • RETURN statement의 끝을 기술한다.

2.29. REWRITE

REWRITE statement는 기존에 존재하는 indexed file이나 relative file의 레코드를 바꿔준다.

REWRITE statement이 실행될 때, 파일은 반드시 I-O mode로 OPEN되어야 한다.

Sequential access mode에서는 성공적인 READ statement 수행 후에 REWRITE statement를 수행할 수 있다.

figure pd rewrite
REWRITE Statement Format

다음은 statement의 각 설정 항목에 대한 설명이다.

  • record-name-1

    • 반드시 data vision FD entry에 기술된 레코드 이름을 사용해야 한다.

    • record-name-1은 qualified 될 수 있다.

  • FROM identifier-1 phrase

    • FROM identifier-1 phrase를 사용한 REWRITE statement의 실행 결과는 다음 순서로 기술된 구문의 실행 결과와 같다.

      MOVE identifier-1 TO record-name-1.
      REWRITE record-name-1
  • identifier-1

    • identifier-1은 반드시 다음 중 하나를 참조해야 한다.

      • working-storage section, local-storage section, 또는 linkage section의 데이터 항목

      • 이미 open된 다른 파일의 record description

      • alphanumeric function.

    • identifier-1은 MOVE statement의 규칙에 따라 record-name-1이 receiving item이 될 수 있는 유효한 sending item이어야 한다.

    • identifier-1과 record-name-1은 같은 저장 공간을 참조해서는 안된다. REWRITE statement의 실행 후 identifier-1의 정보는 여전히 유효하다.

  • INVALID KEY phrases

    • INVALID KEY 조건은 다음과 같을 때 발생한다.

      • Sequential access mode일 때, 변경될 레코드의 prime RECORD KEY의 값이 바로 전에 파일에서 읽었던 레코드의 prime RECORD KEY의 값이 다를 때

      • Prime RECORD KEY의 값이 파일의 어떤 레코드에도 없을 때

      • DUPLICATES가 기술되지 않았는데 ALTERNATE RECORD KEY의 값과 같은 레코드가 이미 파일에 존재할 때

  • END-REWRITE phrases

    • REWRITE문의 끝을 나타낸다.

다음은 각 파일 organization에 따른 REWRITE statement의 동작에 대한 설명이다.

  • Sequential files

    • Sequential files에 대하여 REWRITE statement가 실행되기 전에 마지막에 실행된 input/output statement는 성공적인 READ statement이어야 한다. REWRITE statement가 실행되면 READ statement로 읽었던 레코드가 변경된다.

    • INVALID KEY phrase는 기술되지 않아야 한다. EXCEPTION/ERROR procedure는 기술이 가능하다.

  • Indexed files

    • Access mode가 sequential이라면 prime RECORD KEY의 값에 해당하는 레코드가 변경된다. REWRITE statement가 실행될 때 이 값은 항상 마지막에 읽어온 레코드의 prime record key의 값과 같아야 한다. 즉, access mode가 sequential이면, 마지막에 읽은 레코드에 대해서만 갱신할수 있다. 이때 prime RECORD KEY에 해당하는 부분은 변경할 수 없고, 나머지 데이터에 대해 변경 후 레코드를 갱신할 수 있다.

    • INVALID KEY phrase와 EXCEPTION/ERROR procedure는 생략 가능하다.

    • Access mode가 random또는 dynamic이면 prime RECORD KEY의 값에 해당하는 레코드가 변경된다.

    • Invalid key condition이 발생하면, REWRITE statement는 실패하고 레코드는 변경되지 않는다.

  • Relative files

    • Sequential access mode에는 INVALID KEY phrase는 기술되지 않아야 한다. EXCEPTION/ERROR procedure는 기술이 가능하다. REWRITE statement가 실행되면 READ statement로 읽었던 레코드가 변경된다.

    • Random 또는 dynamic access mode에는 INVALID KEY phrase 또는 EXCEPTION/ERROR procedure를 기술할 수 있다. 둘 다 생략 가능하다. RELATIVE KEY 데이터 항목에 해당하는 레코드가 변경될때 해당 레코드가 파일에 존재하지 않으면 invalid key condition이 발생한다.

SEARCH statement는 주어진 조건을 만족하거나 element를 찾기 위해 연관된 index를 바꾸는 일을 수행한다. END-SEARCH phrase은 SEARCH statement의 끝을 지정한다.

Format 1 (순차 검색)

Format 1은 테이블이 Sort되지 않은 상태에서 검색할 때 사용한다. 또한 Sort된 테이블을 순차적으로 검색하거나 subscripts 또는 index를 직접 조작하여 검색할 때도 사용할 수 있다.

다음은 statement의 각 설정 항목에 대한 설명이다.

  • identifier-1

    • 검색할 테이블을 지정한다.

    • identifier-1에 대한 data description entry는 반드시 INDEXED BY phrase를 가진 OCCURS clause를 포함해야 한다.

    • identifier-1은 subscripted되거나 reference-modified되어서는 안된다.

    • identifier-1은 다차원 테이블에 포함된 하위의 데이터 항목을 참조할 수 있다. 이 경우 테이블의 각 차원마다 INDEXED BY phrase가 기술되어 있어야 한다.

  • AT END

    • WHEN phrase에 기술된 조건들을 만족하는 것 없이 검색을 끝낼 때의 처리를 지정한다. AT END 조건이 되면 imperative-statement-1에 기술된 구문들을 실행한다.

순차 검색을 실행하기 전에 검색을 위한 첫 번째 occurrence를 지정하기 위해서 identifier-1의 첫 번째(또는 유일한) 인덱스 값을 설정해야 한다. 다차원 테이블에 순차 검색을 사용하기 전에, 상위 차원의 인덱스에도 반드시 값을 설정해야 한다.

SEARCH statement는 오직 검색 인덱스와 index-name-1 또는 identifier-2의 값을 수정한다. 따라서 2차원 이상의 테이블 전체를 검색하기 위해서는 각 차원마다 SEARCH statement을 실행시켜주어야 한다. WHEN phrase에서 모든 차원에 대한 인덱스를 사용할 수 있다. SEARCH statement을 실행하기 전에 반드시 관련된 인덱스를 SET statement을 사용해서 값을 설정해야 한다.

검색이 시작되면, identifier-1의 인덱스 값은 다음에 기술된 내용을 따른다.

  • WHEN phrase 안의 조건들이 순서대로 평가된다.

  • 조건들이 하나도 만족되지 않으면, identifier-1의 인덱스를 1 증가시키고, 위의 과정이 반복된다.

  • 조건 중 하나가 만족되면 검색은 즉시 종료되고 해당 조건에 관련된 imperative-statement-2의 구문들이 실행된다. 인덱스는 해당을 만족했을 때의 값을 가지고 있다. NEXT SENTENCE가 기술되어 있다면 다음 점 뒤에 있는 구문을 실행한다.

위 조건을 만족하지 않고 테이블의 마지막에 이르면 검색은 종료된다. 이때 AT END phrase가 있으면 imperative-statement-1의 구문들이 실행된다. 검색이 시작될 때 identifier-1의 index 값이 최댓값보다 크면 검색은 즉시 종료된다.

  • VARYING phrase

    항목 설명

    index-name-1

    identifier-1의 인덱스인 경우 이 인덱스는 검색을 위한 인덱스로 사용된다. 위의 경우가 아니면 검색에 사용된 identifier-1의 인덱스가 증가할 때, 같은 양만큼 index-name-1의 값도 같이 증가한다. index-name-1이 생략되면, identifier-1의 첫 번째 인덱스가 search에 사용된다.

    identifier-2

    index 데이터 항목 이거나 정수 데이터 항목이어야 한다. i index 데이터 항목이면 검색에 사용된 identifier-1의 인덱스가 증가할 때, 같은 양만큼 index-name-1의 값도 같이 증가한다. 정수형 데이터 항목이면 검색에 사용된 identifier-1의 인덱스가 증가할 때, 1씩 증가한다.

  • WHEN phrase

    항목 설명

    condition-1

    "Conditional expressios"에 기술된 조건을 사용할 수 있다.

Format 2(이진 검색)

Format 2(이진 검색)은 테이블의 모든 occurences를 효율적으로 검색할 때 사용한다. 테이블은 반드시 Sort되어 있어야 한다.

다음은 statement의 각 설정 항목에 대한 설명이다.

  • identifier-1

    • 검색할 테이블을 지정한다.

    • identifier-1에 대한 data description entry는 반드시 INDEX BY phrase와 KEY IS를 가진 OCCURS clause를 포함해야 한다.

    • identifier-1은 subscripted되거나 reference-modified되어서는 안된다.

    • identifier-1은 다차원 테이블에 포함된 하위의 데이터 항목을 참조할 수 있다. 이 경우 테이블의 각 차원마다 INDEXED BY phrase가 기술되어 있어야 한다.

  • AT END

    • WHEN phrase에 기술된 조건들을 만족하는 것 없이 검색을 끝낼 때의 처리를 지정한다.

    • AT END 조건이 되면 imperative-statement-1에 기술된 구문들을 실행한다.

SEARCH ALL statement는 이진 검색을 실행한다. 전체 테이블을 검색하므로 identifier-1의 인덱스(검색 인덱스)는 SET statement으로 초기화될 필요가 없다. OCCURS에 명시된 첫 번째 index-name이 항상 쓰이게 된다. 만약, 다차원 테이블의 이진 검색을 하려면 SEARCH ALL statement를 실행하기 전에, SET statement으로 상위 차원의 인덱스 값을 설정해야 한다.

SEARCH statement는 검색 인덱스의 값만 바꾸기 때문에, 2차원 이상의(7차원 까지) 테이블에 대해서 모든 테이블을 검색하려면 각각의 차원에 대해서 SEARCH statement을 수행해야 한다. 테이블의 데이터가 ASCENDING 또는 DESCENDING KEY 순서에 따라 정렬되어 있지 않으면 결과는 예측할 수 없다.

다음은 이진 검색 SEARCH statement의 포맷이다.

  • WHEN phrase

    • WHEN phrase의 조건이 만족되면, 검색은 종료되고 imperative-statement-2의 구문들이 실행되거나 NEXT SENTENCE에 의해 다음 점 뒤에 있는 구문을 실행한다.

    • 테이블에서 만족되는 조건이 없으면 검색은 종료된 후 AT END 조건이 발생하고 AT END phrase가 있으면 imperative-statement-1의 구문들이 실행된다. 두 경우 마지막 index값은 예측할 수 없다.

    • 다음 항목을 설정한다.

      항목 설명

      condition-name-1,

      condition-name-2

      해당 condition-name은 반드시 하나의 값을 가져야 하고, 또한 테이블 element에 대한 ASCENDING 또는 DESCENDING KEY 데이터 항목과 관련되어 있어야 한다.

      data-name-1,

      data-name-2

      ASCENDING 또는 DESCENDING KEY 데이터 항목이어야 하고, identifier-1의 첫 번째 인덱스로 subsciped되어야 한다. 각 data-name은 qualified될 수 있다.

      data-name-1은 identifier-3, literal-1 또는 arithmetic-expression-1과 비교될 수 있는 유효한 오퍼랜드 가 되어야 한다.

      data-name-2은 identifier-4, literal-2 또는 arithmetic-expression-2와 비교될 수 있는 유효한 오퍼랜드가 되어야 한다.

      data-name-1, data-name-2는 floating-point 데이터 항목을 참조해서는 안된다.

      data-name-1, data-name-2는 variable-occurrence 데이터 항목을 포함하는 그룹 항목을 참조해서는 안된다.

      identifier-3,

      identifier-4

      ASCENDING 또는 DESCENDING KEY 데이터 항목일 필요는 없다. identifier-1의 첫 번째 인덱스로 subsciped 될 필요도 없다.

      POINTER, FUNCTION-POINTER, PROCEDURE-POINTER를 usage로 사용한 데이터 항목이 될 수 없다.

      data-name-2은 identifier4, literal-2 또는 arithmetic-expression-2와 비교될수 있는 유효한 오퍼랜드가 되어야 한다.

      literal-1, literal-2

      literal-1은 data-name-1과 비교 가능한 유효한 오퍼랜드가 되어야 한다.

      literal-2은 data-name-2와 비교 가능한 유효한 오퍼랜드가 되어야 한다.

      arithmetic-expression

      Arithmetic expressions에 기술된 표현식이 가능하다.

      identifier-1의 ASCENDING 또는 DESCENDING KEY 데이터 항목을 포함해서는 안된다. identifier-1의 첫 번째 인덱스로 subsciped된 데이터 항목을 포함해서는 안된다.

Search statement 고려할점

index 항목들은 테이블에 대한 직접 접근을 막기위해, 데이터의 subcript로써 사용 할 수없다.

다차원 table에서 search statement의 정확한 동작을 보장하려면, OCCURS DEPENDING ON clause가 정확한 테이블 길이를 명시하는것을 확실히 해야한다.

NEXT SENTENCE

가장 가까운 separator period로 이동한다.

2.31. SET

SET statement는 COBOL 프로그램 내에서 다음과 같은 역할을 수행한다.

  • 테이블에 대한 관리를 위한 INDEX항목 값을 지정한다.

  • INDEX 항목을 지정한 값으로 증가 혹은 감소시킨다.

  • External Switch에 대한 ON/OFF 지정한다.

  • Condition-Name-condition에 대한 TRUE/FALSE 지정한다.

  • USAGE POINTER 항목에 데이터 주소를 지정한다.

  • USAGE PROCEDURE-POINTER/FUNCTION-POINTER에 entry 주소를 지정한다.

OFCOBOL에서는 USAGE INDEX를 통해 지정한 INDEX와 OCCURS INDEXED BY phrase를 통해 지정한 INDEX를 구별하지 않는다. 두 경우 모두 SET을 통해 INDEX 항목 값을 지정할 수 있다.

Format 1

Format 1은 Table에 대한 관리를 위해서 사용하는 statement로서, index-name-1이나 identifier-1에 index-name-2나 identifier-2, 혹은 integer-1의 현재 값을 설정하는 statement이다.

figure pd set format1
SET Statement Format 1

다음은 statement의 각 설정 항목에 대한 설명이다.

  • index-name-1

    • index-name-1은 값을 변경할 필드이다.

    • index-name-1은 Data division의 OCCURS clause에서 INDEXED BY clause로 선언한 항목이다.

  • identifier-1

    • identifier-1은 값을 변경할 필드이다.

    • integer로 지정된 데이터 항목이거나 인덱스 항목이어야 한다.

  • index-name-2

    • index-name-2는 변경할 값을 지정하는 필드이다.

    • 해당 항목의 값은 OCCURS clause의 INDEXED BY phrase에 의해서 지정되어야 한다.

  • identifier-2

    • identifier-2는 변경할 값을 지정하는 필드이다.

    • integer로 지정된 데이터 항목이거나 인덱스 항목이어야 한다.

  • integer-1

    • integer-1은 변경할 값을 지정하는 필드이다. 이 값은 양수만 허용한다.

Format 2

Format 2는 index의 값을 현재의 값을 지정한 값으로 변경하는 것이 아니라, 현재의 값에 지정한 값을 더하거나 빼는 statement이다.

figure pd set format2
SET Statement Format 2

다음은 statement의 각 설정 항목에 대한 설명이다.

  • index-name-3

    • SET statement에 의해서 값이 변경되는 필드이다. 따라서 index-name-3은 SET statement를 수행하기 전과 후, 모두 해당하는 TABLE의 index 범위 안에 포함되어야 한다.

    • 값을 변경하는 필드인 identifier-3은 그룹 항목이 아닌 elementary 정수 데이터 항목이어야 하며, integer-2의 경우에는 0이 아닌 정수이어야 한다.

    • SET statement Format 2가 수행되면, index-name-3은 identifier-3이나 integer-2에 의해서 지정된 값만큼 더하거나(UP BY) 혹은 차감(DOWN BY)시킨다. index-name-3은 여러 필드가 함께 기술될 수 있으며, 여기에 기술된 모든 필드들을 왼쪽에서 오른쪽 순으로 더하거나 빼게 된다.

Format 3

Format 3은 external switch를 위한 SET statement로 mnemonic-name으로 지정된 외부 스위치 값을 ON 또는 OFF로 지정하는 statement이다.

figure pd set format3
SET Statement Format 3

다음은 statement의 각 설정 항목에 대한 설명이다.

  • memonic-name-1

    ON과 OFF로 상태 값을 변경할 수 있는 external switch를 지정해야 한다.

Format 4

Format 4는 Condition 지정을 위한 SET statement이다. 지정한 condition name에 TRUE 값을 지정하도록 하여 이후 문장에서 해당 조건을 수행할 수 있도록 지정하는 statement이다. 해당 condition name에 연관된 value값을 설정한다.

figure pd set format4
SET Statement Format 4

다음은 statement의 각 설정 항목에 대한 설명이다.

  • condition-name-1

    • conditional variable을 지정할 수 있는 condition-name-1을 지정한다.

    • condition-name-1의 VALUE clause에 두 개 이상의 literal이 있는 경우에는, 첫 번째 literal과 동일한 값을 설정한다. condition-name-1을 2개 이상 지정한 경우에는 SET statement를 각각 순서대로 지정한 것과 동일하다.

Format 5

Format 5는 USAGE IS POINTER 데이터 항목을 지정하기 위한 SET statement로 현재의 값을 지정한 값의 주소값으로 변경시킨다.

figure pd set format5
SET Statement Format 5

다음은 statement의 각 설정 항목에 대한 설명이다.

  • identifier-4

    • 변경할 필드이다. 이 데이터 항목은 반드시 USAGE IS POINTER로 지정되어 있어야 한다.

  • ADDRESS OF identifier-5

    • identifier-5는 linkage section 안에 level-01이나 level-77로 지정되어야 한다.

  • identifier-6

    • 변경할 주소값이다. 이 데이터 항목은 반드시 USAGE IS POINTER로 지정되어 있어야 한다.

  • ADDRESS OF identifier-7

    • identifier-7은 linkage section이나 working-storage section 혹은 local-storage section에서 정의한 데이터 항목이어야 한다.

    • level-66이나 level-88을 제외한 다른 레벨의 값을 지정할 수 있다.

    • ADDRESS OF identifier-7은 identifier-7의 주소를 지정하는 것이며, identifier의 값 자체를 의미하는 것이 아니다.

  • NULL, NULLS

    • identifier-4나 identifier-5의 주소 값에 유효하지 않은 주소 값을 지정하기 위해서 사용한다.

2.32. SORT

SORT statement는 한 개 이상의 파일로부터 레코드를 받아서 기술된 KEY에 따라서 정렬한다.

figure pd sort
SORT Statement Format1
figure pd sort2
SORT Statement Format2

다음은 statement의 각 설정 항목에 대한 설명이다.

  • file-name-1

    • 정렬될 레코드가 포함된 file name으로 SD entry에 기술되어 있는 이름이다.

  • identifier-1

    • 정렬될 레코드가 포함된 data description으로 GROUP 타입이며 하위에 정렬할 데이터를 포함하고 있어야 한다.

  • ASCENDING KEY and DESCENDING KEY phrases

    • sort key가 오름차순인지 내림차순인지를 지정한다.

      항목 설명

      data-name-1

      SORT statement에서 사용될 KEY 데이터 항목을 기술한다.

      data-name-1은 file-name-1에 대한 레코드에 포함된 데이터 항목이어야 한다. data item이 기술된 순서에 따라 좌측부터 중요도가 높은 키가 된다. 즉 처음 기술된 데이터 항목이 가장 중요한 키가 되고, 그 다음 나오는 데이터 항목이 그 다음 중요한 키가 된다.

      • KEY 데이터 항목은 각 입력 파일에 대해서 물리적으로 같은 위치에 있어야 하고, data format도 같아야 한다. data-name이 같을 필요는 없다.

      • file-name-1이 하나 이상의 레코드가 기술되어 있다면, KEY 데이터 항목은 그중 하나의 레코드에 기술될 필요가 있다.

      • KEY 데이터 항목은 OCCURS clause를 포함할 수 없고, OCCURS를 포함한 item에 종속될 수 없다.

      • KEY 데이터 항목은 qualified 될 수 있다. KEY 데이터 항목은 다음 데이터 범주중 하나가 된다.

        • Alphabetic, alphanumeric, alphanumeric-edited

        • Numeric

        • Numeric-edited (with usage DISPLAY)

        • Internal floating-point or display floating-point

      file-name-3가 색인 파일(indexed file)을 참조한다면 , data-name-1은 ASCENDING phrase로 기술되어야 하고, data-item은 색인 파일의 major record key와 동일한 위치를 지정해야 한다.

  • DUPLICATES phrase

    • DUPLICATES phrase가 기술되지 않는다면 동일한 key를 가진 레코드들의 순서는 예측할 수 없다.

    • 이 phrase가 지정되면 key가 같은 레코드들에 대해서 정렬된 이후 레코드 순서는 다음과 같다.

      • 입력파일의 레코드 순서와 동일한 순서

      • INPUT PROCEDURE가 있을 때는, RELEASE statement에 사용된 레코드 순서

  • COLLATING SEQUENCE phrase

    • 문법 검사만 이루어진다.

  • USING phrase

    • 입력파일들을 기술한다.

      항목 설명

      file-name-2,...

      입력 파일들을 정의한다. USING phrase가 사용되면 입력 파일들(file-name-2,...,)의 모든 레코드들이 자동적으로 file-name-1으로 전송된다. 모든 입력 파일들은 data division의 FD entries에 기술되어 있어야 한다.

  • INPUT PROCEDURE phrase

    • INPUT PROCEDURE에는 RELEASE statement이 있어, 한번에 하나의 레코드를 file-name-1이 참조하는 파일로 전송한다.

    • 이외에 다양한 구문(OPEN, READ, CLOSE, ...)을 사용함으로써 입력 레코드를 선택, 복사, 수정할 수 있다. 정렬 작업을 수행하기 전에 입력 레코드를 선택하고 수정하는 procedure 이름을 기술한다.

      항목 설명

      procedure-name-1

      INPUT PROCEDURE의 첫 번째(또는 유일한) section이나 paragraph를 기술한다.

      procedure-name-2

      INPUT PROCEDURE의 마지막 section이나 paragraph를 기술한다.

  • GIVING phrase

    • 출력 파일들을 기술한다.

      항목 설명

      file-name-3,...

      출력 파일을 정의한다. GIVING phrase가 기술되면 모든 정렬된 레코드들은 자동적으로 출력 파일로 전송된다. 모든 출력 파일들은 data division의 FD entries에 기술되어 있어야 한다.

  • OUTPUT PROCEDURE phrase

    • OUTPUT PROCEDURE에는 RETURN statement이 있어, 한 번에 하나의 레코드를 file-name-1이 참조하는 파일로부터 전송받는다. 이외에 다양한 구문(OPEN, WRITE, CLOSE, ...)을 사용함으로써 출력 레코드를 선택, 복사, 수정할 수 있다.

    • 정렬 작업을 수행한 후 출력 레코드를 선택하고 수정하는 procedure 이름을 기술한다.

      항목 설명

      procedure-name-3

      OUTPUT PROCEDURE의 첫 번째(또는 유일한) section이나 paragraph를 기술한다.

      procedure-name-4

      OUTPUT PROCEDURE의 마지막 section이나 paragraph를 기술한다.

2.33. START

START statement는 indexed 또는 relative file에서 이어지는 다음 레코드를 읽기 위한 레코드 위치를 설정한다. START statement이 실행될 때 연관된 파일은 INPUT mode 또는 I-O mode로 open되어야 한다.

figure pd start
START Statement Format

다음은 각 설정 항목에 대한 설명이다.

  • file-name-1

    • Sequential 또는 dynamic access mode의 파일 이름이어야 한다.

    • file-name-1은 Data division의 FD entry에 정의되어야 한다.

  • KEY phrases

    • Key phrase가 기술되면 file position indicator는 조건이 만족하는 키를 가진 레코드에 위치하게 된다.

      이후 READ statement을 통해 다음 레코드들을 순차적으로 읽을 수 있다.

      항목 설명

      data-name-1

      Qualified 될 수 있다. 하지만 subscripted될 수는 없다.

      START statement이 실행될 때 data-name-1의 현재 값과 파일의 해당하는 키를 비교하게 된다.

    • file-control entry에 FILE STATUS가 기술되어 있으면 START statement이 실행될 때 관련된 file status key도 변경한다.

  • INVALID KEY phrases

    • 다음은 invalid key 조건이 발생하는 경우이다.

      • Indexed file에 대하여 sequential access이고, OUTPUT으로 open되었을 때 prime record key 값이 이전 레코드보다 크지 않은 경우

      • Indexed file에 대하여 I-O 또는 OUTPUT으로 open되었을 때 prime record key 값이 이미 존재하는 레코드의 prime record key 값과 같은 경우

      • Relative file에 대하여 random 또는 dynamic access일 때 RELATIVE KEY가 이미 존재하는 레코드의 RELATIVE KEY와 같은 경우

  • END-START phrases

    • START statement의 끝을 나타낸다.

2.34. STOP

STOP statement는 프로그램의 수행을 일시적으로 또는 영구적으로 중단한다.

figure pd stop
STOP Statement Format

다음은 statement의 각 설정 항목에 대한 설명이다.

  • literal

    • 부동 소수를 포함한 어떠한 alphanumeric 리터럴이 될 수 있다.

    • 또한 ALL 리터럴을 제외한 Figurative constant가 될 수 있다.

STOP statement에서 literal이 사용된 경우, 프로그램 수행 중에 STOP statement를 만나게 되면, literal을 출력한 후 프로그램의 수행을 일시적으로 멈춘다. 이때 사용자가 액션을 수행하게 되면 STOP statement 이후의 문장을 수행하게 된다.

STOP RUN은 프로그램의 수행을 중단한 후 시스템으로 제어권을 넘긴다. STOP RUN statement 이후에 다른 statement가 있어도 이 statements는 수행되지 않고 프로그램 수행 중에 OPEN한 모든 파일에 대해서도 close한다.

다음은 STOP RUN statement를 메인 프로그램과 서브 프로그램에서 수행하였을 때의 결과이다.

구분 결과

메인 프로그램

프로그램의 제어를 SYSTEM으로 넘긴다. 즉, 프로그램을 종료하게 된다.

서브 프로그램

프로그램의 제어를 메인 프로그램을 호출한 프로그램으로 넘긴다. 즉, 프로그램을 종료하게된다.

2.35. STRING

STRING statement는 2개 이상의 데이터 항목이나 리터럴의 내용 일부 또는 전부를 하나로 합쳐서 하나의 데이터 항목으로 만든다. 비슷한 작업을 위해 MOVE statement를 여러 개 사용하는 대신에 하나의 STRING statement를 사용할 수 있다.

figure pd string
STRING Statement Format

다음은 statement의 각 설정 항목에 대한 설명이다.

  • identifier-1, literal-1

    • 소스가 되는 데이터 필드를 지정한다. USAGE DISPLAY 또는 USAGE DISPLAY-1이 명시적 또는 암묵적으로 지정된 데이터 항목이어야 한다. Alphanumeric type의 special register가 올 수 있다.

    • literal-1은 alphanumeric 카테고리에 속해 있어야 한다. ALL이라는 워드로 시작하지 않는 임의의 Figurative constant(NULL 제외)를 지정할 수 있다. Figurative constant는 각각 1문자의 영숫자 리터럴로 간주된다.

  • DELIMITED BY phrase

    • 문자열을 구분짓는 구분자를 지정한다.

    • 다음 항목을 설정한다.

      항목 설명

      identifier-2, literal-2

      문자열을 구분짓는 구분자를 지정한다.

      MOVE할 때 구분될 문자를 타나낸다. SIZE 지정이 있을 경우에는 identifier-1 또는 literal-1에 지정된 데이터 항목 모두가 MOVE된다.

      Figurative constant(단, ALL 제외)를 지정했을 경우에는 1byte 문자 하나를 지정했음을 의미한다. literal-2는 alphanumeric이어야 한다.

      SIZE

      주어진 문자열 전체를 지정한 것을 의미한다.

  • INTO phrase

    • destination 필드를 지정한다.

    • 다음 항목을 설정한다.

      항목 설명

      identifier-3

      destination 문자열을 지정한다. 최종적으로 만들어진 문자열이 담길 데이터 항목을 지정한다. JUSTIFIED clause를 지정할 수 없다.

      identifier-3가 USAGE DISPLAY일 경우, identifier-1 및 identifier-2는 USAGE DISPLAY이어야 하고, alphanumeric 리터럴을 가져야 한다. ALL을 제외한 모든 Figurative Constant가 나올 수 있다. Figurative constant는 각각 1문자의 영숫자 리터럴로 간주된다.

      identifier-3가 USAGE DISPLAY-1일 경우, identifier-1 및 identifier-2는 USAGE DISPLAY-1이어야 하고, DBCS 리터럴을 가져야 한다. SPACE 외의 모든 Figurative constant는 올 수 없다.

  • WITH POINTER phrase

    • 결과 데이터를 담는 데이터 필드의 문자 길이를 가리킨다. 포인터 필드는 소스 문자열의 USAGE가 DISPLAY, DISPLAY-1일 때 상대적인 문자의 길이 정보다.

    • 포인터 필드는 결과 데이터의 길이보다 1을 더한 값을 담을 수 있는 충분한 크기의 데이터 필드를 지정한다.

    • 다음 항목을 설정한다.

      항목 설명

      identifier-4

      포인터 필드를 지정한다. 지정할 경우 프로그래머가 명시적으로 이용할 수 있지만, 초기값 설정에 주의를 기울여야 한다.

      identifier-4의 초기값은 1 이상의 값이어야 한다. 초기값이 설정되어 있지 않거나 1 이상의 값이 아닐 경우에는 값을 보장하지 않는다.

identifier-4를 제외한 모든 항목은 USAGE DISPLAY, DISPLAY-1중 하나여야 한다.

identifier-1,2가 numeric 카테고리의 데이터 항목을 참조할 경우 각각의 숫자 항목은 PICTURE 문자열 내에 기호 P를 지정하지 않은 정수로 기술해야 한다.

identifier-1,2가 elementary 데이터이면서 USAGE DISPLAY 타입을 가지고있고, numeric, numeric-edited, alphanumeric-edited 항목이면 이는 alphanumeric 항목인것으로 취급된다.

subscript, reference modification, variable-length, function identifier등의 모든것의 evaluation은 STRING statement의 시작과 함께 진행된다.

  • ON OVERFLOW phrase

    • 오버플로우는 다음과 같은 상황에서 발생한다.

      • 포인터 필드의 값이 1보다 작을 경우

      • 포인터 필드의 값이 입력으로 받은 데이터 필드보다 클 경우

        오버플로우가 발생하면 데이터는 더 이상 MOVE되지 않는다. 오버플로우가 발생한 시점에 ON OVERFLOW와 함께 지정된 명령어로 제어가 흘러간다.

    • 명령어에서 명시적으로 제어의 이동이 있을 경우에는 해당 명령어의 규칙에 따라 그렇지 않을 경우에는 명령어를 실행 후 STRING statement의 끝이 수행된다.

    • STRING statement를 실행할 때 오버플로우 조건이 발생하지 않았다면 ON OVERFLOW는 무시 된다. 이때 프로그램의 제어권은 STRING statement의 끝 또는 NOT ON OVERFLOW 지정이 있을 경우엔 함께 지정된 명령어로 제어가 이동된다.

    • 다음 항목을 설정한다.

      항목 설명

      imperative-statement-1

      오버플로우가 발생하는 경우 실행될 statement를 기술한다.

  • END-STRING phrase

    • STRING statement 범위의 끝을 명시적으로 지정한다.

    • END-STRING phrase를 사용하여 다른 조건문에 STRING statement를 조건식으로 중첩하여 사용할 수 있다.

데이터 흐름

STRING statement는 소스가 되는 필드에서 최종 결과물이 담기는 목표 필드로 문자를 전송한다. 소스 필드는 STRING statement에 기술된 순서에 따라 처리된다.

다음 규칙이 적용된다.

  • 소스 필드에서 receiving필드로 문자는 다음과 같은 방법으로 전송된다.

    • 2byte 문자일 경우에는 2byte 문자간의 MOVE 규칙이 적용된다.

    • 그 이외의 경우 영숫자간의 기본 이동에 관한 MOVE 규칙이 적용된다.

  • DELIMITED BY identifier-2 또는 literal-2을 지정했을 경우, 각각 소스 필드는 가장 왼쪽에 위치한 문자에서 시작해서 한 문자씩 다음에 해당되는 지점까지 MOVE된다.

    • 해당 소스 필드의 분리문자를 만났을 경우(분리문자 자체는 MOVE되지 않는다)

    • 해당 소스 필드의 가장 오른쪽 문자까지 MOVE됐을 경우

  • DELIMITED BY SIZE 지정이 있을 경우에는 해당 소스 필드의 전체가 MOVE 다.

  • receiving 필드가 꽉차거나 또는 모든 소스 필드에 대한 처리가 끝날 때까지 데이터 전송 조작이 이루어진다.

  • POINTER를 지정할 경우 사용자는 소스가 되는 필드의 포인터 값을 명시적으로 설정해야 한다.

STRING statement에서 데이터 처리가 완료되고 나면 목표 필드는 데이터가 이동된 부분만 변경된다. 목표 필드에서 변경되지 않은 부분에는 STRING statement 실행 전의 데이터가 들어 있다.

2.36. SUBTRACT

SUBSTRACT statement는 FROM 이후에 지정된 한 개 이상의 numeric item에서 한 개의 numeric item이나 numeric item들의 합을 뺀 다음, 그 결과를 FROM 이후에 지정된 데이터 항목에 저장한다.

  • Format 1

    Format 1은 FROM 앞에 지정된 식별자들 또는 문자상수를 합한 후에 그 결과값을 FROM 이후에 지정된 identifier-2에서 빼서 결과를 identifier-2에 저장한다. identifier-2가 여러 개 지정되어 있을 경우는 각각의 identifier-2에 대해 뺄셈 연산을 왼쪽에서 오른쪽으로 수행하고 실행한 결과값을 해당하는 identifier-2에 저장한다.

    figure pd subtract format1
    SUBTRACT Statement Format 1
  • Format 2

    Format 2는 FROM 앞에 지정된 식별자들 또는 문자상수를 합한 후에 그 결과값을 FROM 이후에 지정된 identifier에서 빼서 결과값을 identifier-3에 저장한다.

    figure pd subtract format2
    SUBTRACT Statement Format 2
  • Format 3

    Format 3은 identifier-2의 elementray 데이터 항목에서 이름이 동일한 identifier-1의 elementray item에 대해서 뺄셈 연산을 수행한 후 결과값을 해당하는 identifier-2의 elementray 데이터 항목에 저장한다.

    figure pd subtract format3
    SUBTRACT Statement Format 3

다음은 statement의 각 설정 항목에 대한 설명이다.

  • identifier

    • format 1에서 identifier-1, identifier-2는 elementray numeric, floating-point 데이터 항목이어야 한다.

    • format 2에서 identifier-1, identifier-2는 elementray numeric , floating-point데이터 항목이어야 하고, identifier-3은 numeric 데이터 항목 또는 numeric-edited 데이터 항목이어야 한다.

    • format3에서 identifier는 alphanumeric그룹 항목이어야 한다.

  • literal

    • literal은 상수 문자, floating-point이어야 한다.

  • ROUNDED phrase

  • SIZE ERROR phrase

  • CORRESPONDING phrase

  • END-SUBTRACT phrase

    • END-SUBTRACT phrase는 SUBTRACT phrase의 범위를 명시적으로 나타내기 위해 지정한다.

2.37. UNSTRING

UNSTRING statement를 사용하여 소스로 입력된 필드 중 연속된 데이터를 여러 개의 필드로 분할할 수 있다.

figure pd unstring
UNSTRING Statement Format

다음은 statement의 각 설정 항목에 대한 설명이다.

  • identifier-1

    • 소스가 되는 데이터 필드를 지정한다.

    • 지정된 필드의 데이터가 INTO와 함께 지정된 데이터 필드 identifier-4로 MOVE된다.

    • identifier-1은 alphabetic, alphanumeric, alphanumeric-edited, DBCS 카테고리에 속한 데이터이어야 한다.

  • DELIMITED BY phrase

    • 데이터를 전송할 때 데이터를 구분짓기 위한 구분자를 지정한다.

    • DELIMITED BY phrase를 지정하지 않았을 경우에는 DELIMITER IN phrase 및 COUNT IN phrase를 지정할 수 없다.

    • 다음 항목을 설정한다.

      항목 설명

      identifier-2,identifier-3

      한 개 이상의 구분자를 지정한다. alphabetic, alphanumeric, alphanumeric-edited, DBCS 카테고리에 속한 데이터여야 한다.

      literal-1, literal-2

      한 개 이상의 구분자를 지정한다. alphanumeric, DBCS를 사용할 수 있고, figurative constant 중 ALL literal을 지정할 수 없다.

      • ALL이 지정된 경우

        여러 개의 연속된 구분자는 한 회만 나온것으로 간주된다. 이 delimiter는 identifier-5가 명시되어 있다면 receiving field인 identifier-5로 전송된다. 여러 개의 delimiting character들은 같은 elementary 항목의 same usage를 가진 것으로 간주되고, 현재의 delimiter receving field에 전송된다.

      • 2문자 이상의 구분자

        2개의 문자 이상을 구분자로 지정할 경우 연속해 있고 소스 필드로 지정한 데이터 항목 안에 있을 경우 구분문자로써 인식된다.

      • 2개 이상의 구분자

        2개 이상의 구분문자를 지정할 경우에는 OR 조건이 적용된다. 어느 쪽이든 구분문자가 오버랩되서 나타날 때마다 지정된 소스 데이터 필드 내에 구분문자로 인식된다.

        예를 들어 다음과 같은 지정이 있을 경우나 AB 또는 BC가 들어있는 데이터 필드를 입력으로 받을 경우 구분문자로 인식된다. 이 경우 ABC가 나타날 경우 AB에 먼저 매칭된다.

        DELIMITED BY "AB" or "BC"
  • INTO phrase

    • 분할 처리된 데이터를 담을 필드를 지정한다.

      항목 설명

      identifier-4

      destination 필드를 지정한다. 하나 이상의 데이터 필드를 지정한다.

      identifier-4는 alphabetic, numeric, DBCS카테고리에 속한 데이터 항목을 참조한다. 참조되는 데이터 항목이 numeric 카테고리일 경우에 해당 PICTURE 문자열에 P를 포함할 수 없다. identifier-4가 USAGE DISPLAY 인 데이터 항목을 참조할 경우 identifer-1, identifier-2, identifier-3 및 identifer-5 도 모두 USAGE DISPLAY이어야 한다. 또한 모든 리터럴은 alphanumeric 리터럴이어야 한다. 마찬가지로 USAGE DISPLAY-1인 경우는 위에 언급된 항목들이 USAGE DISPLAY-1 혹은 DBCS 리터럴이어야한다.

      ALL 워드로 시작하는 Figurative constant와 NULL을 제외한 임의의 Figurative constant 지정이 가능하며 이는 1byte의 영숫자 리터럴을 지정한 것과 같다.

      identifier-5

      구분자로 인해 구분되어진 데이터를 담을 필드를 지정한다. alphabetic, alphanumeric, DBCS 데이터 카테고리를 가져야한다.

      identifier-6

      identifier-4에 MOVE된 데이터 길이를 담을 필드를 지정한다. 정수데이터 항목이며, PICTURE symbol 'P’를 포함해서는 안된다.

  • DELIMITER IN phrase

    • 구분자로 인해 제거된 데이터를 저장할 필드를 지정한다.

      항목 설명

      identifier-5

      alphabetic, alphanumeric 카테고리 데이터 항목이어야 한다.

  • COUNT IN phrase

    • 구분자 조건을 통과한 데이터의 길이가 저장되는 필드이다. 구분자는 길이에 포함되지 않는다.

      항목 설명

      identifier-6

      identifier-4에 MOVE된 데이터 길이를 담을 필드를 지정한다.

      identifier-6는 PICTURE 문자열에서 P를 사용하지 않은 정수 데이터 항목이어야 한다.

  • POINTER phrase

    • POINTER phrase 지정이 있을 경우엔 포인터 필드 identifier-7의 값은 데이터가 하나씩 MOVE 될 때마다 증가한다. 최종적으로 UNSTRING statement 실행이 종료하면 포인터 필드에는 소스 데이터 항목 내에서 주어진 구분자 조건을 통과한 길이가 초기값에 더해진 값이 들어간다.

    • UNSTRING statement 실행 전에 사용자가 포인터 필드의 값을 초기화해야 한다.

    • 다음 항목을 설정한다.

      항목 설명

      identifier-7

      처리 데이터의 길이를 저장할 데이터 필드를 지정한다.

      PICTURE 문자열에서 기호 P를 지정하지 않은 정수 데이터 항목을 지정한다.

      identifier-1에서 참조되는 데이터의 길이에 1을 더한 값이 충분히 들어갈 크기의 데이터 항목이어야 한다.

  • TALLYING IN phrase

    • TALLYING phrase 지정이 있을 경우 카운트 필드 identifier-8에 최종적으로 분할된 데이터 항목들의 총 길이에 초기값이 더해진 값이 저장된다.

    • UNSTRING statement 실행 전에 사용자가 해당 필드의 값을 초기화해야 한다.

    • 다음 항목을 설정한다.

      항목 설명

      identifier-8

      구분자에 의해 제거된 데이터 항목의 길이를 저장할 데이터 필드를 지정한다.

      PICTURE 문자열에서 기호 P를 지정하지 않은 정수 데이터 항목을 지정한다.

  • ON OVERFLOW phrase

    • 오버플로우는 다음과 같은 조건에서 발생한다.

      • 포인터 필드의 값이 1보다 작을 경우

      • 포인터 필드의 값이 출력되는 필드의 길이보다 커질 경우

      • 모든 입력 필드에 대한 처리가 끝나도 소스 필드에 데이터가 남아있을 경우

      오버플로우가 발생하면 UNSTRING 처리가 종료되고, ON OVERFLOW 지정이 있을 경우엔 해당 명령어로 제어가 흘러간다. 명령어에서 명시적으로 제어의 이동이 있을 경우에는 해당 명령어의 규칙에 따라 그렇지 않을 경우에는 명령어를 실행 후 UNSTRING statement가 종료된다.

      오버플로우가 발생하지 않았고, NOT ON OVERFLOW 지정이 있을 경우에는 지정된 명령어로 제어가 이동한다. 지정이 없을 경우에는 UNSTRING 처리가 종료된다.

    • 다음 항목을 설정한다.

      항목 설명

      imperative-statement-1

      오버플로우가 발생할 때 실행될 statement를 기술한다.

  • END-UNSTRING phrase

    • UNSTRING statement 범위의 끝을 명시적으로 지정한다. END-UNSTRING phrase를 사용하여 다른 조건문에서 UNSTRING statement를 조건식으로 중첩하여 사용할 수 있다.

2.38. WRITE

WRITE statement는 레코드를 출력 파일에 write한다 .

Sequential file은 반드시 OUTPUT 또는 EXTEND mode로 OPEN되어 있어야 한다.

Indexed file이나 relative 파일은 반드시 OUTPUT, I-O, 또는 EXTEND mode로 OPEN되어 있어야 한다.

  • Format 1

    figure pd write format1 sequential files
    WRITE Statement Format 1
    figure pd write format1 phrase1
    WRITE Statement Format 1 : phrase
    figure pd write format1 invalid key
    WRITE Statement Format 1 : invalid_key
    figure pd write format1 not invalid key
    WRITE Statement Format 1 : not_invalid_key
  • Format 2

    figure pd write format2 indexed and relative files
    WRITE Statement Format 2
  • Format 3

    figure pd write format3 line sequential files
    WRITE Statement Format 3

다음은 statement의 각 설정 항목에 대한 설명이다.

  • record-name-1

    • 반드시 data vision FD entry에 기술되어 있어야 한다.

    • record-name-1은 qualified될 수 있다. sort/merge 파일과 연관되어서는 안된다.

  • FROM phrase

    • FROM phrase를 가진 WRITE statement의 실행 결과는 다음 두 문장을 실행시킨것과 같다.

      MOVE identifier-1 TO record-name-1.
      WRITE record-name-1.
  • identifier-1

    • identifier-1은 다음 중 하나를 참조한다.

      • working-storage section, local-storage section 또는 linkage section의 entry

      • 이미 open된 다른 파일의 record description

      • alphanumeric function.

    • identifier-1은 MOVE statement의 규칙에 따라 record-name-1이 receiving 항목이 될 수 있는 유효한 sending 항목이어야 한다.

    • identifier-1과 record-name-1은 같은 저장 공간을 참조해서는 안된다.WRITE statement의 실행후, identifier-1의 정보는 여전히 유효하다.

  • identifier-2

    반드시 integer 데이터 항목이어야 한다.

  • ADVACING phrases

    ADVANCING phrase는 출력 레코드의 페이지 위치를 조정한다.

    • ADVANCING phrase rules

      ADVANCING phrase가 기술되면 다음의 규칙을 따른다.

      • BEFORE ADVANCING이 기술되면 line이 먼저 찍히고 페이지가 진행된다.

      • AFTER ADVANCING이 기술되면 페이지가 진행되고 line이 찍힌다.

      • identifier-2가 기술되어 있으면, 페이지는 identifier-2의 값에 해당라인 만큼 진행한다. identifier-2는 integer data item이어야 한다.

      • integer-1이 기술되어 있으면, 페이지는 integer-1 값에 해당하는 라인 수만큼 진행된다.

      • integer-1 또는 identifier-2의 값은 0가 될 수 있다.

      • PAGE가 기술되어 있다면, 다음 논리적 페이지로 진행되기 전,후 (AFTER, BEFORE phrase에 따라)에 레코드가 찍힌다.

      • mnemonic-name이 기술되면, 채널 1~12까지 건너뛰거나 space supression이 일어난다. mnemonic-name은 SPECIAL-NAMES paragraph에 기술되어 있어야 한다.

      ADVANCING phrase가 WRITE statement에 기술되거나, 파일에 LINAGE clause가 있으면, carriage control character가 생성되어 레코드에 첨가된다. ADVANCING phrase가 생략되면 AFTER ADVANCING 1 LINE이 기술된 것처럼 동작한다.

    • LINAGE-COUNTER rules

      파일에 LINAGE clause가 기술되어 있으면, LINAGE-COUNTER special register는 WRITE statement가 실행될 때마다 다음의 규칙에 따라 수정된다.

      • ADVANCING PAGE가 기술되어 있으면 LINAGE-COUNTER는 1이 된다.

      • ADVANCING identifier-2 또는 integer-1이 기술되어 있으면, LINAGE-COUNTER는 identifier-2 또는 integer-1의 값만큼 증가한다.

      • ADVANCING phrase가 생략되어 있으면, LINAGE-COUNTER는 1만큼 증가한다.

      • 새 페이지가 된다면 LINAGE-COUNTER는 1이 된다.

  • END-OF-PAGE phrases

    • END-OF-PAGE phrases가 기술되어 있고, WRITE statement에 의해 논리적 페이지의 마지막에 이르면, END-OF-PAGE phrase의 imperative-statement-3에 기술된 statement를 실행한다. END-OF-PAGE phrase가 기술되어 있으면, FD entry는 반드시 LINAGE clause를 포함하고 있어야 한다.

    • END-OF-PAGE condition은 page body 내의 footing area에 레코드 라인이 찍히거나 ADVANCING phrase에 의해 공백이 생기면 발생한다.

      다시 말하면, END-OF-PAGE condition은 LINAGE-COUNTER special register 의 값이 LINAGE clause의 WITH FOOTING phrase에 기술된 값과 같거나 크면 발생한다.

    • Automatic page overflow condition은 WRITE statement가 실행되면서 현재 page body에서 완전히 처리되지 못하고 다음 페이지로 넘어가야 할 때 발생한다.

    • END-OF-PAGE condition이나 Automatic page overflow condition이 발생되고 END-OF-PAGE phrases가 기술되어 있으면 imperative-statement-3에 기술된 statement를 실행한다.

  • INVALID KEY phrases

    • 다음은 invalid key 조건이 발생하는 경우이다.

      • Indexed file에 대하여 sequential access이고 OUTPUT으로 open되었을 때 prime record key 값이 이전 레코드보다 크지 않은 경우

      • Indexed file에 대하여 I-O 또는 OUTPUT으로 open되었을 때 prime record key 값이 이미 존재하는 레코드의 prime record key 값과 같은 경우

      • Relative file에 대하여 random 또는 dynamic access일 때 RELATIVE KEY가 이미 존재하는 레코드의 RELATIVE KEY와 같은 경우

  • END-WRITE phrases

    • 명시적으로 WRITE statement의 끝을 나타낸다.

다음은 각 I-O mode별 WRITE statement 사용에 대한 설명이다.

  • sequential files

    • Sequential file의 최대 레코드 길이는 파일이 생성될때 결정되고 이후로는 바뀌지 않는다.

    • File position indicator는 WRITE statement 실행에 영향을 미치지 않는다.

    • File control entry에 FILE STATUS clause가 기술되어 있으, WRITE statement 실행후에 결과 값으로 file status key를 갱신한다.

  • indexed files

    • Indexed files에 대하여 WRITE statement를 실행하기 전에 prime record key( file control entry에 RECORD KEY로 정의된 데이터 항목)를 원하는 값으로 설정해야 한다. 이 값은 파일에서 유일해야 한다.

    • File control entry에 ACCESS IS SEQUENTIAL이 기술되어 있다면 RECORD KEY 값의 순서에 따라 레코드들이 파일에 쓰여져야 한다.

  • relative files

    • File control entry에 ACCESS IS SEQUENTIAL이 기술되어 있다면 첫 번째 레코드는 relative record number 1, 두 번째 레코드는 relative record number 2, 세 번째 레코드는 relative record number 3, ...과 같이 파일에 쓰여진다. 이때, File control entry에 RELATIVE KEY가 기술되어 있다면 쓰여진 레코드의 relative number가 RELATIVE KEY에 저장된다.

    • File control entry에 ACCESS IS RANDOM 또는 ACCESS IS DYNAMIC이 기술되어 있다면 WRITE statement가 실행되기 전에 RELATIVE KEY가 반드시 지정된 값을 가지고 있어야 한다. WRITE statement가 실행되고 레코드는 이 값의 relative number로 파일에 저장된다.

2.39. XML GENERATE

XML GENERATE statement는 데이터를 XML 형식으로 변환한다.

figure pd xml generate
XML GENERATE Statement Format

다음은 XML GENERATE statement 형식의 각 항목에 대한 설명이다.

  • identifier-1

    • 생성되는 XML 문서를 받는 영역이다.

    • identifier-1은 다음 중 하나를 참조해야 한다.

      • alphanumeric 의 기본 데이터 항목

      • alphanumeric 그룹 항목

      identifier-1이 alphanumeric 그룹 항목을 참조할 때 identifier-1은 alphanumeric 의 기본 데이터 항목인 것처럼 취급된다.

      identifier-1은 JUSTIFIED 절이 포함된 데이터가 될 수 없고, function identifier도 될 수 없다. identifier-1은 subscript나 reference modified를 가질 수 있다. identifier-1은 identifier-2와 identifier-3과 겹칠 수 없다.

      identifier-1은 생성되는 XML 문서를 포함할 수 있은 만큼 충분히 커야 한다. 일반적으로 identifier-2 내의 데이터 이름 또는 데이터 이름의 길이에 따라서 identifier-2 의 크기의 5배에서 10배 사이즈를 사용하는 것이 좋다. 만약 identifier-2이 충분히 크지 않으면 XML GENEARTE statement의 끝에 오류 조건이 존재한다.

  • identifier-2

    • XML 형식으로 변환되는 기본 데이터 항목 또는 그룹을나타낸다.

    • identifier-2는 function identifier이거나 reference modified를 가질 수 없지만, subscript는 가질 수 있다. identifier-2는 identifier-1과 identifier-3과 겹칠 수 없다. identifier-2는 RENAMES 절을 지정하면 안된다.

      identifier-2로 지정된 다음과 같은 데이터 항목은 XML GENERATE statement에서 무시된다.

      • 종속된 이름 없는 기본 데이터 항목 또는 기본 FILLER 데이터 항목

      • SYNCHRONIZED 항목에 대해 삽입된 임의의 여유 바이트

      • REDEFINES 절로 설명되거나 이러한 재정의된 항목에 종속된 모든 데이터 항목

      • RENAMES 절로 설명한 항목에 종속된 모든 데이터 항목

      • 하위 데이터 항목이 모두 무시되는 모든 그룹 데이터 항목

    • 위의 규칙에 따라 무시되지 않는 identifier-2에 의해 지정된 모든 데이터 항목은 다음 조건을 충족해야 한다.

      • 각 기본 데이터 항목은 alphabetic, alphanumeric, numeric 또는 index 데이터 항목이어야 한다.

      • 이러한 기본 데이터 항목이 하나 이상 있어야 한다.

      • FILLER가 아닌 데이터 이름은 바로 중첩된 그룹 데이터 항목 내에서 고유한 이름을 가져야 한다.

      • 데이터 항목은 DATA FORMAT 절을 지정해서는 안된다.

  • identifier-3

    • COUNT IN 구문을 지정한 경우 identifier-3은 XML GENERATE statement 실행 후에 생성된 XML 문자의 인코딩 단위의 갯수를 포함한다. 일반적으로 갯수는 바이트이다.

    • identifier-3은 picture 문자열에서 P 없이 정의된 정수 데이터 항목이어야 한다. identifier-3은 identifier-1, identifier-2와 겹치지 않아야 한다.

      • Indexed file에 대하여 sequential access이고, OUTPUT으로 open되었을 때 prime record key 값이 이전 레코드보다 크지 않은 경우

      • Indexed file에 대하여 I-O 또는 OUTPUT으로 open되었을 때 prime record key 값이 이미 존재하는 레코드의 prime record key 값과 같은 경우

      • Relative file에 대하여 random 또는 dynamic access일 때 RELATIVE KEY가 이미 존재하는 레코드의 RELATIVE KEY와 같은 경우

  • ON EXCEPTION phrase

    • XML 문서를 생성하는 동안 오류가 발생할 경우 예외 조건이 있다. 예를 들어 identifier-1이 생성된 XML 문서를 포함할 만큼 크지 않은 경우 XML 생성이 중지되고 identifier-1의 내용은 정의되지 않는다. 만약 COUNT IN 구문이 지정되어 있었다면 dientifier-3에는 0에서 identifier-1의 길이까지의 범위로 생성된 문자 위치의 수가 포함되어 있다.

    • ON EXCEPTION 구문이 지정된 경우 제어는 imperative-statement-1로 전송된다. ON EXCEPTION 구문이 지정되어 있지 않으면 NOT ON EXCEPTION 구문이 있더라도 무시되고 제어는 XML GENERATE statement의 끝으로 전송된다.

  • NOT ON EXCEPTION phrase

    • NOT ON EXCEPTION 구문이 지정되어 있으면 XML 문서를 생성하는 동안 예외 조건이 발생하지 않으면 제어는 imperative-statement-2로 전송되며, 그렇지 않으면 XML GENERATE statement의 끝으로 전송된다. ON EXCEPTION 구문이 지정되어 있으면 무시된다.

  • END-XML phrase

    • XML GENERATE 또는 XML PARSE statement의 끝을 나타낸다.

2.40. XML PARSE

XML PARSE statement는 XMLPARSE 컴파일러 옵션의 설정에 따른 COBOL 언어 인터페이스이다.

XMLPARSE(XMLSS)와 XMLPARSE(COMPAT)로 두 종류가 있는데, OFCOBOL에서는 XMLPARSE(XMLSS)를 기준으로 다루게 된다.

XML PARSE statement는 XML 문서를 개별 조각으로 분석하고 각 문서를 사용자가 작성한 처리 절차에 전달하게 된다.

figure pd xml parse
XML PARSE Format

다음은 XML PARSE statement 형식의 각 항목에 대한 설명이다.

  • identifier-1

    • identifier-1은 XML 문서의 문자열을 포함한다. identifier-1은 alphanumeric이나 alphanumeric 그룹 데이터 항목이어야 한다.

  • PROCESSING PROCEDURE phrase

    • XML 파서가 생성하는 다양한 이벤트를 처리하는 절차의 이름을 지정한다.

      • procedure-name-1, procedure-name-2

        procedure division 안에 있는 섹션이나 단락을 지정해야 한다. procedure-name-1과 procedure-name-2가 모두 지정된 경우, 같은 절차 영역 안에 있는 섹션이나 단락이어야 한다. 만약 둘 중 하나가 declarative 내에 있는 이름이면, 둘 다 동일하게 declarative 내에 있는 이름이어야 한다.

      • procedure-name-1

        처리 절차의 첫 번째 (또는 유일한) 섹션 또는 단락을 지정한다.

      • procedure-name-2

        처리 절차의 마지막 섹션 또는 단락을 지정한다.

    • XML 이벤트에 대해 파서는 procedure-name-1 이라는 절차의 첫 번째 statement 으로 제어를 전송한다. 제어는 항상 처리 절차에서 XML 파서로 반환된다.

      제어가 반환되는 지점은 다음과 같이 결정된다.

      • procedure-name-1이 단락 이름이고 procedure-name-2가 지정되지 않은 경우, procedure-name-1 단락의 마지막 statement를 실행한 후 반환된다.

      • procedure-name-1이 섹션 이름이고 procedure-name-2가 지정되지 않은 경우, procedure-name-1 섹션의 마지막 단락의 statement를 실행한 후 반환된다.

      • procedure-name-2가 지정되어 있고 단락 이름이면, procedure-name-2 단락의 마지막 statement를 실행한 후 반환된다.

      • procedure-name-2가 지정되어 있고 섹션 이름이면, procedure-name-2 섹션의 마지막 단락의 statement를 실행한 후 반환된다.

      procedure-name-1과 procedure-name-2 사이에 필요한 유일한 관계는 procedure-name-1로 명명된 절차에서 시작하여 procedure-name-2로 명명된 절차의 실행으로 끝나는 연속적인 실행 순서를 정의하는 것이다. 반환점으로가는 경로가 2개 이상인 경우, procedure-name-2는 EXIT statement 으로만 구성된 단락의 이름을 지정할 수 있으며, 반환점으로가는 모든 경로는 이 단락으로 이루어져야 한다.

    • 처리 절차는 XML 이벤트가 처리되는 모든 문장으로 구성된다. 처리 절차의 범위에는 처리 절차의 범위에 있는 CALL, EXIT, GO TO, GOBACK, PERFORM statement가 실행되는 모든 문장이 포함된다. 처리 절차의 범위는 GOBACK 또는 EXIT PROGRAM 문을 실행하지 않아야 한다. 처리 절차에서는 STOP RUN statement를 사용하여 실행 장치를 종료할 수 있다.

  • ON EXCEPTION phrase

    • ON EXCEPTION 구문은 XML PARSE statement에서 예외 조건이 발생할 때 실행된다.

    • XML 파서가 XML 문서를 처리하는 동안 오류를 탐지하는 경우 예외 조건이 있다. 파서는 먼저 'EXCEPTION’이 포함된 특수 레지스터 XML-EVENT를 사용하여 제어를 처리 절차에 전송하여 XML 예외를 나타낸다. 또한 일반 XML 이벤트에 대해 파서로 돌아가기 전에 처리 절차에서 XML-CODE를 -1로 설정한 경우에도 예외 조건이 존재한다. 이 경우 파서가 XML-EVENT를 'EXCEPTION’으로 표시하지 않고 구문 분석이 종료된다.

    • ON EXCEPTION 구문이 지정된 경우 파서는 imperative-statement-1로 제어를 전송한다. ON EXCEPTION 구문이 지정되지 않고 NOT ON EXCEPTION 구문이 지정된 경우 NOT ON EXCEPTION 구문은 무시되고 제어는 XML PARSE statement 끝으로 전송된다. 처리 절차에서 XML 예외 이벤트를 처리하고 XML-CODE를 0으로 설정한 후 제어 권한을 파서로 반환하는 경우 예외 조건은 더이상 존재하지 않는다.

  • NOT ON EXCEPTION phrase

    • NOT ON EXCEOPTION 구문은 XML PARSE 처리를 종료하는 경우 예외 조건이 존재하지 않을 때 실행된다. XML PARSE 처리를 종료할 때 예외 조건이 존재하지 않는 경우 NOT ON EXCEPTION이 지정되어 있으면 제어가 NOT ON EXCEPTION 구문의 imperative-statement-2로 전송된다. NOT ON EXCEPTION 구문이 지정되어 있지 않으면 제어는 XML PARSE statement의 끝으로 전송되며 ON EXCEPTION 구문이 지정되어 있으면 무시된다.

    • 특수 레지스터 XML-CODE는 XML PARSE statement를 실행한 후에 0을 포함한다.

  • END-XML phrase

    • XML GENERATE 또는 XML PARSE statement의 끝을 나타낸다.