Data Division

본 장에서는 Data Division의 구조에 대해서 설명한다.

1. 개요

다음은 Data Division의 structure 구조와 data unit, data relationship에 대한 설명이다.

  • FILE SECTION

    File Section에서는 데이터 파일의 구조를 정의한다. File Section은 반드시 "FILE SECTION." 헤더로 시작해야 한다.

    구분 설명

    file-description-entry

    파일의 물리적 구조와 식별자를 정의한다. 파일과 연관된 레코드들을 갖는다.

    record-description-entry

    파일과 연관된 data description entry들의 집합이다.

    레코드는 alphabetic, alphanumeric, DBCS, numeric elementary item이거나 alphanumeric group item이어야 한다.

  • WORKING-STORAGE SECTION

    Working-storage section에서는 파일에 속하지 않고 프로그램 상에서 사용되는 데이터 레코드의 구조를 정의한다. 반드시 "WORKING-STORAGE SECTION." 헤더로 시작해야 한다.

    구분 설명

    record-description-entry

    계층적인 구조의 레코드들로 이루어져 있다.

    data-item-description-entry

    그룹으로 묶이지 않은 독립적인 데이터 항목이다. 77 또는 01 레벨을 갖는다.

  • LOCAL-STORAGE SECTION

    Local-storage section은 invocation마다 storage가 free되고 새로 할당된다. 또한 데이터 항목에 명시된 VALUE값으로 초기화된다. 반드시 "LOCAL-STORAGE SECTION." 헤더로 시작해야 한다.

  • LINKAGE SECTION

    Linkage section은 다른 프로그램을 통해 사용할 수 있게 되는 데이터들을 정의한다.

Data Relationships
  • Levels of data

    • Data record의 level number는 0 ~ 49 또는 66, 77, 88 중 하나여야 한다.

      level number 설명

      01

      alphanumeric group item이거나, 01 레벨 elementary item이 될 수 있다.

      02 ~ 49

      그룹에 속한 record elementary item 또는 그룹이 될 수 있다.

      level-number item간의 relationship을 통해 데이터 계층을 구분할 수 있다.

      다음은 동일한 level-number을 통해 계층관계를 정의한 예제이다.

      01 GROUP.
         05 SUB01.
            10 ELEM01 PIC X(10).
            10 ELEM02 PIC X(5).
         05 SUB02.
            10 ELEM03 PIC 999.
            10 ELEM04 PIC 999.

      다음과 같이 Level number은 다르지만, 동일한 계층으로 정의할 수도 있다.

      01 GROUP.
         05 SUB01.
            10 ELEM01 PIC X(10).
            10 ELEM02 PIC X(5).
         04 SUB02.
            08 ELEM03 PIC 999.
            08 ELEM04 PIC 999.
    • Special level-numbers

      level number 설명

      66

      Renames clause와 함께 쓰이는 level number로, 이전에 정의된 데이터 아이템을 regroup하여 재사용할 때 쓰인다.

      77

      하부에 데이터를 더이상 가지지 않는 독립적인 아이템을 명시할 때 쓰인다.

      88

      condition-name condition과 함께 쓰인다.

Classes and categories of data

COBOL에서 쓰이는 데이터들과 리터럴들은 특정 카테고리나 클래스로 분류할 수 있다.

  • Class, category, and usage of elementary data Items

    Class Category Usage

    Alphabetic

    Alphabetic

    DISPLAY

    Alphanumeric

    Alphanumeric

    DISPLAY

    Alphanumeric-edited

    DISPLAY

    Numeric-edited

    DISPLAY

    DBCS

    DBCS

    DISPLAY-1

    Numeric

    NUMERIC

    DISPLAY

    PACKED-DECIMAL, COMP-3

    BINARY, COMP, COMP-4, COMP-5

    Internal floating-point

    COMP-1

    COMP-2

    External floating-point

    DISPLAY

  • classes and categories of functions

    Function-type Class and Category

    Alphanumeric

    Alphanumeric

    DBCS

    DBCS

    Numeric, Integer

    Numeric

  • classes and categories of literals

    Literal Class and Category

    Alphanumeric

    Alphanumeric

    DBCS

    DBCS

    Numeric(fixed, floating)

    Numeric

Data item Category descriptions

다음은 Data item Category description 항목에 대한 설명이다. 각 항목에 대한 자세한 사항은 PICTURE clause 항목을 참조한다.

  • Alphabetic

    PICTURE 캐릭터에 의해 alphabetic으로 정의된 아이템이다.

  • Alphanumeric

    PICTURE 캐릭터에 의해 alphanumeric으로 정의된 아이템이다.

    • Alphanumeric group item

    • Alphanumeric function

  • Alphanumeric-edited

    PICTURE 캐릭터에 의해 alphanumeric-edited로 정의된 아이템이다.

  • DBCS

    PICTURE 캐릭터에 의해 DBCS로 정의된 아이템이다. USAGE DISPLAY-1을 명시해야 한다.

  • External floating-point

    PICTURE 캐릭터에 의해 External floating-point로 정의된 아이템이다.

  • Internal floating-point

    USAGE COMP-1이나 COMP-2를 통해 Internal floating-point를 명시한 아이템이다.

  • Numeric

    PICTURE 캐릭터에 의해 numeric으로 정의된 아이템이다(BLANK WHEN ZERO clause를 갖고 있지 않아야 한다).

    • BINARY, COMP, COMP-4, COMP-5, COMP-3, PACKED-DECIMAL 타입의 USAGE를 쓰는 elementary data item

    • numeric / integer function

  • Numeric-edited

    PICTURE 캐릭터에 의해 Numeric-edited로 정의된 아이템 또는 BLANK WHEN ZERO clause를 가지고있는 numeric 아이템이다.

2. File Description entry

Enviroment division의 SELECT clause에서 정의한 파일들에 대한 설명의 시작을 나타내며, FileDescription(FD) 혹은 SortFileDescription(SD) 다음에는 파일 이름을 기술해야 한다.

  • Format 1

    figure dd file description entry format1
    File description entry Format 1
    figure dd file description entry format1 clause1
    File description entry Format 1 : clause1
    figure dd file description entry format1 clause2
    File description entry Format 1 : clause2
  • Format 2

    figure dd file description entry format2
    File description entry Format 2
    figure dd file description entry format2 clause1
    File description entry Format 2 : cluase
  • Format 3

    figure dd file description entry format3
    File description entry Format 3
    figure dd file description entry format3 clause1
    File description entry Format 3 : clause
  • Format 4

    figure dd file description entry format4
    File description entry Format 4
    figure dd file description entry format4 clause1
    File description entry Format 4 : clause1
    figure dd file description entry format4 clause2
    File description entry Format 4 : clause2

2.1. File section

File section은 각 input output file의 level-indicator(FD, SD) 포함한다.

항목 설명

file-name

반드시 level-indicator(FD, SD) 다음에 기술해야 하고, 연관된 SELECT clause에 기술되어 있어야 한다. file-name은 프로그램 내에서 유일해야 한다.

FD(format 1,2,3)

FD entry의 마지막 clause 뒤에 반드시 점(.)이 와야 한다.

sort/merge 파일을 제외한 모든 파일에 대해서 File section은 반드시 FD entry를 포함해야 한다.

SD(format4)

sort/merge 파일에 대해서 File section은 반드시 SD entry를 포함해야 한다.

SD entry의 마지막 clause 뒤에 반드시 점(.)이 와야 한다.

File section의 레코드는 반드시 alphanumeric 그룹 항목 또는 alphabetic, alphanumeric, DBCS, numeric의 elementary 데이터 항목이어야 한다.

2.1.1. EXTERNAL clause

EXTERNAL clause은 COBOL program 실행 unit 내 (run unit)에서 서로 다른 프로그램이 파일을 공유하기 위해 지정한다.

2.1.2. GLOBAL clause

GLOBAL clause는 중첩된 프로그램과 중첩하는 프로그램 사이에 파일을 공유하기 위해 지정한다.

2.1.3. BLOCK CONTAINS clause

BLOCK CONTAINS clause는 레코드의 물리적 길이를 정의한다. 이 구문은 Syntax는 확인하지만, 실제 실행에는 영향을 주지 않는다.

2.1.4. RECORD clause

RECORD clause가 사용될 때 레코드의 길이는 레코드 내에 기술된 데이터 항목의 USAGE와 상관없이 레코드를 저장할 때 필요한 bytes 수로 기술되어야 한다. 예를 들어 10자의 DBCS 문자로 이루어진 레코드가 있다면, RECORD clause는 RECORD CONTAINS 20 CHARACTERS로 기술해야 한다. RECORD clause가 생략되면, 컴파일러는 record description으로 레코드 길이를 결정한다.

Format 1

Format 1은 고정길이 레코드의 길이를 기술한다.

figure dd record clause format1
RECORD CONTAINS Format 1
항목 설명

integer-3

레코드의 길이를 양의 정수로 기술해야 한다.

Format 2

Format 2은 고정길이 또는 가변길이 레코드의 길이를 기술한다.

figure dd record clause format2
RECORD CONTAINS Format 2
항목 설명

integer-4

레코드의 길이의 최솟값을 양의 정수로 기술한다.

integer-5

레코드의 길이의 최댓값을 양의 정수로 기술한다.

integer-4와 integer-5가 같으면 고정길이 레코드가 된다.

Format 3

Format 3은 가변길이 레코드의 길이를 기술한다.

figure dd record clause format3
RECORD CONTAINS Format 3
항목 설명

integer-6

레코드의 길이의 최솟값을 양의 정수로 기술한다.

integer-7

레코드의 길이의 최댓값을 양의 정수로 기술한다.

data-name-1

unsigned integer 타입의 elementary 데이터 항목이어야 한다.

RELEASE, REWRITE 또는 WRITE statement가 실행되기 전에 data-name-1에 레코드 길이를 넣어야 한다.

DELETE, RELEASE, REWRITE, START, WRITE statement의 실행이나 실패한 READ 또는 RETURN statement의 실행에 대해서 data-name-1의 값은 변하지 않는다.

성공적인 READ 또는 RETURN statement의 실행이 이루어지면 data-name-1의 값은 방금 가져온 레코드의 길이로 바뀐다.

2.1.5. LABEL RECORDS clause

LABEL RECORDS clause는 라벨의 존재 유무를 정의한다. 이 구문은 Syntax는 확인하지만, 실제 실행에는 영향을 주지 않는다.

2.1.6. VALUE OF clause

VALUE OF clause는 파일과 관련된 라벨레코드를 정의한다. 이 구문은 Syntax는 확인하지만, 실제 실행에는 영향을 주지 않는다.

2.1.7. DATA RECORDS clause

DATA RECORDS clause는 파일과 연관된 데이터 이름을 정의한다. 이 구문은 Syntax는 확인하지만, 실제 실행에는 영향을 주지 않는다.

2.1.8. LINAGE clause

LINAGE clause는 논리적 페이지의 크기를 라인 수로 기술한다. 선택적으로 논리적 페이지의 footing area 시작 위치, top and bottom margins을 기술해줄 수 있다.

LINAGE clause는 OUTPUT 또는 EXTEND로 open된 sequential 파일에 유효하다.

항목 설명

data-name-5, integer8

논리적 페이지의 라인 수를 지정한다. 해당 라인수로 지정되는 페이지의 영역은 page body라고 한다. 값은 0보다 커야 한다.

WITH FOOTING AT

integer-9 또는 data-name-6의 값은 page body안 footing area의 시작 위치를 라인 수로 지정한다. 값은 0보다 커야 하고 page body의 마지막 라인보다 크면 안된다.

LINES AT TOP

integer-10 또는 data-name-7의 값은 논리적 페이지의 top margin을 지정한다. 값은 0 이상 이어야 한다.

LINES AT BOTTOM

integer-11 또는 data-name-8의 값은 논리적 페이지의 bottom margin을 지정한다. 값은 0 이상이어야 한다.

다음 그림은 LINAGE clause의 각 부분에 대한 설명이다.

figure dd linage clause
logical page
  • LINES AT TOP phrase, LINES AT BOTTOM phrase가 기술되지 않으면 해당 값은 0을 가정한다.

  • FOOTING phrase가 생략되면 page body의 값과 같다. (integer-8 or data-name-5)

  • OPEN OUTPUT statement가 실행되는 시점에 integer-8, integer-9, integer-10, integer-11의 값이 기술되어 있으면, 해당 값은 프로그램이 실행되는 동안 논리적 페이지를 구성하는 값으로 사용된다.

  • OPEN OUTPUT statement가 실행되는 시점에 data-name-5, data-name-6, data-name-7, data-name-8의 값이 있으면, 해당 값은 첫 번째 페이지의 논리적인 페이지를 구성한다. 이후 WRITE statement가 실행되어 페이지를 넘어가는 시점에 data-name-5, data-name-6, data-name-7, data-name-8의 값이 다시 새로운 논리적 페이지를 구성한다.

  • SD에 기술된 LINEAGE clause는 문법 체크만 이루어지고, 실행에는 영향을 미치지 않는다.

  • 파일마다 LINAGE-COUNTER special register가 존재한다.

2.1.9. RECORDING MODE clause

RECORDING MODE clause는 파일의 물리적 레코드의 format을 지정한다. VSAM 파일에 대해서는 무시된다.

항목 설명

Recording mode F(fixed)

모든 레코드들이 같은 길이를 가진다.

Recording mode V(variable)

레코드들은 가변 길이를 가진다.

2.1.10. CODE-SET clause

CODE-SET clause는 magnetic tape file의 캐릭터 코드를 지정한다. 이 구문은 Syntax는 확인하지만, 실제 실행에는 영향을 주지 않는다.

3. Data description entry

Data description entry는 데이터 항목의 속성을 지정하는 것으로써 Data description entry들의 집합을 Record description entry라고 한다. 한 개의 독립적인 데이터 항목을 정의하는 Data description entry는 데이터 항목 description entry라고 한다. Data description entry는 아래와 같이 3가지 형식이 있다.

Format 1
figure dd format1
Data description entry Format 1

다음과 같은 예외를 제외하고는 각각의 절은 순서에 상관없이 지정이 가능하다.

  • data-name-1과 FILLER를 지정하는 경우 data-name-1 또는 FILLER는 반드시 level-number 바로 다음에 기술해야 한다. level-number는 01에서 49 사이의 숫자나 77을 지정한다.

  • REDEFINES clause은 반드시 data-name-1 또는 FILLER 다음에 기술해야 한다. 만약, data-name-1 또는 FILLER를 지정하지 않은 경우는 level-number 다음에 REDEFINES clause을 기술해야 한다.

Format 2
figure dd format2
Data description entry Format 2
항목 설명

level-66 entry

또 다른 level-66 entry, level-01, level-77, level-88 entry를 rename할 수 없다.

레코드와 연관되어 있는 level-66 entry는 해당 레코드 다음에 기술해야 한다.

Format 3
figure dd format3
Data description entry Format 3
항목 설명

level-88 entry

level-88 entry는 반드시 조건변수를 기술한 Data description entry 바로 다음에 기술해야 한다.

condition-name-1

condition-name-1은 value-clause에 지정한 단일값 또는 여러 개의 값 혹은 범위 값을 조건변수와 연결시키기 위해 사용자가 정의한 이름이다.

3.1. LEVEL NUMBER clause

level-number clauses는 레코드 내에 데이터의 계층 구조를 표현하기 위해 지정하거나 renamed entry, redefined item, condition-name entry를 위해 지정한다.

figure dd level number
level number clauses Format
  • level-number

    • level-number는 1에서 49 사이에 숫자나 66, 77, 88들 중에 하나를 지정할 수 있다.

    • 01과 77은 Area A에서 시작되어야 하며, data-name 또는 FILLER 혹은 그 외의 Data description과 공백 문자로 구분되어야 한다.

      02에서 49는 Area A 또는 Area B의 어디서든 시작될 수 있으며, data-name 또는 FILLER 혹은 그 외의 data description절과 공백 문자로 구분되어야 한다.

      66과 88은 Area A 또는 Area B의 어디서든 시작될 수 있으며, data-name 또는 FILLER 혹은 그 외의 data description절과 공백 문자로 구분되어야 한다.

    • 1에서 9까지 한 자리 level-number를 기술했을 경우는 level-number 01에서 09까지 지정한 것과 동일하게 처리한다.

    • data description entry는 첫 번째 entry와 동일한 컬럼에서 시작하거나 level-number에 따라 들여쓰기가 가능하다. 들여쓰기는 level-number와는 관계가 없으며 단지 코드의 가독성을 높이기 위한 것이다. 들여쓰기는 컬럼 수는 Area B의 크기만 넘지 않으면 제한은 없다.

  • data-name-1

    • data-name-1은 프로그램 내에서 데이터 항목을 구분하는 식별자로써 data-name-1은 반드시 level-number 바로 다음에 기술해야 한다.

    • level-66과 level-88 항목은 반드시 data-name-1을 기술해야 한다.

  • FILLER

    • FILLER는 memory alignment 등을 맞추기 위해 기술되는데 FILLER로 지정된 항목은 프로그램 내에서 참조할 수 없다.

    • FILLER keyword는 옵션으로 FILLER가 지정되어 있는 경우는 FILLER 바로 전에 level-number가 지정되어야 한다.

    • 조건변수에 FILLER를 지정할 수는 있지만 condition-name에는 FILLER를 지정할 수 없다.

    • MOVE CORRESPONDING statement이나 ADD CORRESPONDING statement 또는 SUBTRACT CORESPONDING statement을 처리할 때는 FILLER 항목은 무시된다. 또한 INITIALIZE statement에서도 FILLER 항목은 무시된다.

data-name-1 또는 FILLER가 지정되지 않은 경우 해당 항목은 FILLER가 지정된 것으로 간주한다.

3.2. BLANK WHEN ZERO clause

BLANK WHEN ZERO clauses은 데이터 값이 0일 때 데이터 값을 0이 아닌 공백으로 저장되도록 하기 위해 지정한다.

figure dd blankwhenzero
BLANK WHEN ZERO clauses Format

다음의 규칙에 따라 지정한다.

  • BLANK WHEN ZERO clause은 numeric-edited나 numeric 카테고리인 elementary 데이터 항목에만 지정할 수 있다.

  • picture 문자열에 'S’나 '*' 문자는 지정할 수 없고, USAGE DISPLAY만 사용이 가능하다.

  • numeric 카테고리 데이터에 대해서 BLANK WHEN ZERO clause을 지정하는 경우 해당 데이터 항목은 numeric-edited 카테고리 항목으로 인식한다.

3.3. JUSTIFIED clause

JUSTIFIED clause은 alphabetic, alphanumeric 카테고리 항목에 데이터를 복사하는 경우 문자들을 오른쪽으로 정렬하기 위해 지정한다.

figure dd justified
JUSTIFIED clause Format

JUSTIFIED clause은 elementary 데이터 항목에만 지정할 수 있으며, JUST는 JUSTIFIED의 축약형이다.

아래와 같은 경우는 JUSTIFIED clause을 기술할 수 없다.

  • numeric, numeric-edited, alphanumeric-edited 항목

  • index 데이터 항목

  • USAGE FUNCTION-POINTER, USAGE POINTER, USAGE PROCEDURE-POINTER가 지정되어 있는 경우

  • external floating-point나 internal floating point 항목

  • Level-66(RENAME), Level-88(conditional-name) 데이터 항목

JUSTIFIED clause가 지정되어 있는 항목에 데이터가 복사되는 경우 데이터의 문자는 오른쪽으로 정렬된다. 복사하려는 원본 데이터의 길이가 복사되는 데이터 길이보다 큰 경우 가장 왼쪽에 위치한 문자부터 초과된 길이만큼의 문자가 truncate된다. 복사하려는 원본 데이터의 길이가 복사되는 데이터 길이보다 작은 경우 남은 공간은 스페이스로 채워진다.

단 시스템 로케일이 ja_JP.sjis, ja_JP.SJIS, ja_JP일 때 G타입 변수에 'JUST RIGHT' 옵션을 설정한 경우 빈 공간을 2bytes 공백(0x8140)으로 채운다.

3.4. EXTERNAL clause

EXTERNAL clause은 COBOL 프로그램 실행 unit 내 (run unit)에서 서로 다른 프로그램이 데이터 항목을 공유하기 위해 지정한다. UNIX 환경에서는 공유 라이브러리 형태의 별개로 컴파일된 프로그램 간에 데이터를 공유하기 위해 사용한다.

EXTERNAL clause은 working-storage section의 01 level Data description entry에만 지정할 수 있다.

external 속성이 지정된 01 레벨 데이터 항목이 레코드 항목인 경우는 index 항목을 제외하고는 이 레코드 항목에 속한 서브 데이터 항목들도 external 속성을 가진다.

서로 다른 프로그램에서 external 속성을 지정해서 데이터를 공유하는 경우는 서로 다른 프로그램에서 EXTERNAL으로 지정된 레코드 모두 이름이 동일해야 하며 동일한 메모리 크기를 가져야 한다.

3.5. GLOBAL Clause

GLOBAL clause는 중첩하는 프로그램과 중첩된 프로그램 사이에 데이터를 공유하기 위해 지정한다.

중첩된 프로그램에서 Global 속성이 지정된 항목과 동일한 이름을 가지는 데이터 항목을 지정한 경우는 중첩된 프로그램에 해당 데이터 항목은 더 이상 Global 데이터 항목이 아니다. Global 속성이 지정된 레코드 항목에 속한 데이터 항목, condition-name, index item 모두 global name이 될 수 있다.

GLOBAL clause는 working-storage section, linkage section, local-storage section, file section에 지정할 수 있으며, 01 level Data description entry에만 지정할 수 있다.

같은 Data division 내에 같은 이름을 가진 데이터 항목이 있다면, 이 데이터 항목들은 GLOBAL clause를 가져선 안된다. global name을 지정한 프로그램에 직접적으로나 간접적으로 포함된 프로그램에서 global name은 다시 지정하지 않아도 참조가 가능하다.

3.6. OCCURS clause

OCCURS clause는 index나 subscript를 사용해서 element를 참조하는 테이블을 정의한다. 기술된 데이터 항목의 데이터 이름을 OCCURS clause의 subject라고 한다. OCCURS clause의 subject나 이 데이터 항목에 종속된 서브 항목을 참조하기 위해서는 index나 subscript를 사용해야 한다. 단, 다음과 같은 경우에는 index나 subscrpit를 사용하지 않는다.

  • subject가 SEARCH 구문의 subject로 사용된 경우

  • subject나 subject에 종속된 데이터 항목이 ASCENDING/DESCENDING key phrase의 object인 경우

  • subject에 종속된 항목이 REDEFINES clause의 object인 경우

다음과 같은 data description entry에는 OCCURS clause를 지정해서는 안된다.

  • 01, 66, 77, 88 레벨의 데이터 항목

  • redefine된 데이터 항목((redefine object)

테이블에는 고정길이 테이블(Fixed-length tables)과 가변길이 테이블(Variable-length table)이 있으며, 설정 방법이 다르다.

Fixed-length tables

고정길이 테이블(Fixed-length tables)은 OCCURS clause에 데이블의 크기를 문자 상수로 지정하여 기술한다.

figure dd fixed length table
OCCURS clause Format 1 : 고정길이 테이블
  • integer-2

    • integer-2는 테이블의 크기를 지정하는 값으로 0보다 큰 양의 정수 값을 지정해야 한다.

  • ASCENDING KEY and DESCENDING KEY phrases

    • ASCENDING 또는 DESCENDING 지정에 따라 데이터들이 올림차순 또는 내림차순으로 정렬된다. 데이터의 정렬 순서는 data-name-2의 값에 따라 결정된다.

    • 다음은 data-name-2 항목에 대한 설명이다.

      항목 설명

      data-name-2

      data-name-2는 subject entry 자신이나 subject entry에 소속된 데이터 항목이다.

      data-name-2가 subject entry 자신인 경우는 모든 entry가 ASCENDING KEY 또는 DESCENDING KEY가 되며, 이 테이블에 대해 유일한 key가된다.

      data-name-2가 subject entry가 아닌 경우는 subject에 종속된 서브 항목이어야 하며, 서브 항목과 자신에 OCCURS clause가 지정되어 있어서는 안된다.

    • ASCENDING KEY 또는 DESCENDING KEY 구를 지정하는 경우는 다음과 같은 규칙을 따라 한다.

      • key는 중요도에 따라 왼쪽에서 오른쪽으로 순서로 지정한다.

      • key는 최대 12개를 넘지 않도록 한다.

      • 테이블 안의 데이터는 올림차순, 내림차순으로 정렬되어야 한다.

      • key로 지정하는 데이터 항목은 BINARY, DISPLAY, DISPLAY-1, PACKED-DECIMAL, COMP, COMP-1, COMP-2, COMP-3, COMP-4, COMP-5만 지정할 수 있다.

  • INDEXED BY phrase

    • INDEXED BY phrase는 해당 테이블에 사용될 인덱스를 지정한다.

      항목 설명

      index-name-1

      index-name-1은 해당 인덱스 이름으로 컴파일러에 의해 생성되는 인덱스로써 프로그램 내에 별도의 Data description을 기술할 필요가 없다. index-name-1의 scope은 인덱스가 지정된 테이블과 같다.

Variable-length tables

가변길이 테이블(Variable-length table)은 다음 그림과 같이 OCCURS DEPENDING ON을 사용해서 지정한다.

figure dd variable length table
OCCURS clause Format 2 : 가변길이 테이블
항목 설명

integer-1

가변길이 테이블의 최소 크기를 지정하는 값으로 0보다 큰 양의 정수 값이어야 하며, 가변길이 테이블의 최대 크기인 integer-2보다 작거나 같은 값이어야 한다.

integer-1을 생략하는 경우는 가변길이 테이블의 최소 크기는 1이다.

integer-2

가변길이 테이블의 최대 크기를 지정하는 값으로 integer-1보다 크거나 같은 값이어야 한다.

data-name-1

OCCURS DEPENDING ON clause의 object로 설정한다.

Dataitem의 current value가 테이블의 수를 결정한다. object는 정수형 데이터 항목이어야 한다. object는 테이블 내의 메모리 공간을 차지하면 안된다. 즉, subject의 서브 데이터 항목은 지정해서는 안된다. object로 지정된 데이터 항목은 OCCURS DEPENDING ON clause을 지정해서는 안된다. OCCURS clause가 GLOBAL clause를 갖고있는 아이템의 하위 항목이면, object 또한 global name이어야 한다.

3.7. PICTURE clause

PICTURE clause은 elementary 항목의 카테고리, 데이터 사이즈, editing 속성을 지정한다.

figure dd picture
PICTURE clause Format
항목 설명

PICTURE or PIC

PIC는 PICTURE의 축약형이다. PICTURE clause은 아래와 같은 경우를 제외하고는 element 데이터 항목에는 반드시 기술해야 한다.

  • index 데이터 항목

  • RENAME clause을 기술한 경우

  • USAGE POINTER, USAGE FUNCTION-POINTER, USAGE-PROCEDURE-POINTER가 기술되어 있는 경우

  • internal-floating point 데이터 항목

character-string

character-string은 Picture Symbol로서 element 데이터 항목의 카테고리 및 데이터 사이즈를 결정한다.

Picture Symbol

다음은 Picture Symbol로 사용되는 문자로 소문자와 대문자는 동일한 의미를 가진다.

A B E G P S V X Z 9 0 / , . + - *

SPECIAL-NAMES paragraph에 DECIMAL-POINT IS COMMA가 지정되어 있는 경우 소수점(.) 문자는 콤마(,)로, 콤마는 소수점으로 변경된다.

다음은 각 Picture Symbol의 기능과 각 문자 하나가 데이터 항목에서 차지하는 크기에 대한 설명이다.

Symbol 기능

A

  • Latin alphabet이나 공백이 저장될 수 있는 문자 위치를 지정한다. (반복 지정이 가능)

  • 크기 : 1byte

B

  • USAGE DISPLAY에 대해서 공백 문자를 삽입 위치를 지정한다. (반복 지정이 가능)

  • 크기 : 1byte

E

  • External Floating-point 항목의 exponent의 시작점을 지정한다.

  • 크기 : 1byte

G

  • DBCS 문자 위치를 지정한다. (반복 지정이 가능)

  • 크기 : 2bytes

P

  • 가소수점(assumed decimal point)를 명시한다. leftmost 또는 rightmost에 여러 번 지정이 가능하다.

  • 크기 : 실제 저장공간을 차지하지 않는다.

S

  • operation sign의 존재여부를 지정한다. (한 번만 지정이 가능)

  • 크기 : 실제 저장공간을 차지하지 않는다. 단, SIGN clause에 SEPARATE CHARACTER phrase가 지정되어 있는 경우는 operation sign도 데이터 항목 내에 1byte 저장공간을 차지한다.

V

  • assumed decimal point의 위치를 지정한다. (한 번만 지정이 가능)

  • 크기 : 실제 저장공간을 차지하지 않는다.

X

  • alphanumeric 문자가 저장될 수 있는 문자 위치를 지정한다. (반복 지정이 가능)

  • 크기 : 1byte

Z

  • 유효 숫자의 왼쪽 0을 공백으로 치환하는 문자위치를 지정한다. (반복 지정이 가능)

  • 크기 : 1byte

9

  • 숫자가 저장될 수 있는 문자 위치를 지정한다. (반복지정이 가능)

  • 크기 : 1byte(alphanumeric, numeric-edited 카테고리 데이터 항목은 1byte를 차지하지만, numeric 카테고리 데이터 항목은 USAGE 지정에 따라 저장공간이 달라진다.)

/

  • slash(/)가 삽입될 위치를 지정한다.

  • 크기 : 1byte

0

  • 숫자 0이 삽입될 문자 위치를 지정한다. (반복 지정이 가능)

  • 크기 : 1byte

,

  • 콤마(,)가 삽입될 위치를 지정한다. (반복 지정이 가능)

  • 크기 : 1byte

.

  • 소수점(.)이 삽입될 위치를 지정한다. (한 번만 지정이 가능)

  • 크기 : 1byte

+/-

  • 편집 부호가 삽입될 위치를 지정한다.

  • 크기 : 1byte

CR/DB

  • 편집 부호가 삽입될 위치를 지정한다.

  • 크기 : 2bytes

*

  • 유효 숫자 왼쪽에 0을 '*'으로 치환하는 문자 위치를 지정한다. (반복 지정이 가능)

  • 크기 : 1byte

cs(currency sign)

  • cs는 통화 기호를 의미하며, 통화 기호의 위치를 지정한다. 기본 통화 기호는 달러 기호($)로 SPECIAL-NAMES paragraph의 CURRENCY SIGN clause 설정에 따라 변경될 수 있다.

  • 첫 번째 통화 기호 사이즈만큼의 저장공간을 차지한다. 그 외의 통화 기호(통화 기호가 공백으로 표시되는) 위치에서는 1byte 저장공간을 차지한다.

다음은 picture character-string symbol의 지정 순서이다.

figure dd order of picture character strings
picture character-string의 상대적인 지정 순서
기호 설명

최상위에 지정된 Symbol이 앞에 지정되었을 때 그 다음에 올 수 있는 지정 가능한 Symbol을 의미한다.

{}

중괄호 안에 기술된 Symbol은 함께 지정할 수 없는것을 의미한다.

중복해서 표기된 Symbol

nonfloating insertion symbol {+ -}, floating insertion symbol {Z *}, {+ -}, cs, P는 중복해서 지정할 수 있음을 의미한다. 가장 왼쪽 또는 윗줄에 있는 Symbol은 소수점 왼쪽에서 사용되는 Symbol을 나타내며, 그 다음에 있는 Symbol은 소수점 오른쪽에 사용되는 Symbol을 나타낸다.

데이터 카테고리

Picture symbol의 조합에 의해서 다음과 같은 데이터 카테고리로 분류할 수 있다.

  • Alphabetic

    • picture character-string에 A symbol만 지정되어 있는 항목이다. 항목의 값으로는 Latin alphabetic과 공백 문자, fugurative constant의 symbolic-characters 만을 포함해야 한다.

    • Alphabetic 항목은 USAGE DISPLAY가 명시적으로 지정하거나 암묵적으로 지정된 것으로 간주한다.

  • Numeric

    • picture character-string에 9, P, V, S symbol 들로만 포함되어 있는 항목이다.

    • USAGE clause에 Binary, Packed decimal(internal decimal), Zoned decimal(External decimal)인 numeric 타입의 항목이다.

    • Numeric 타입 항목은 다음의 표와 같다.

      타입 USAGE clause

      Binary

      BINARY, COMP, COMP-4, COMP-5

      Internal decimal

      PACKED-DECIMAL, COMP-3

      Zoned decimal(external decimal)

      DISPLAY

      • S symbol은 picture character-string의 가장 왼쪽에 지정해야 한다.

      • V symbol은 picture character-string에 한 번만 지정해야 한다.

      • binary 타입의 경우 지정할 수 있는 자릿수는 최대 18자리까지 가능하다.

    • Internal decimal과 Zoned decimal 타입의 경우 지정할 수 있는 자릿수는 최대 31자리까지 가능하다.

    • Value로 지정할 수 있는 항목은 numeric literal이거나 figurative constant ZERO이다.

    • 다음은 PICTURE에 따른 Valid range에 대한 예시이다.

      PICTURE Range of Values

      PICTURE

      Range of Values

      9999

      0 ~ 9999

      S99

      -99 ~ +99

      S9999V99

      -9999.99 ~ +9999.99

      PPP999

      0 ~ 0.000999

      S999PPP

      -1000 ~ -999000, 1000 ~ 999000, 0

  • Numeric-Edited

    • picture character-string에 지정한 Symbol에 의해 특정 위치에 특정 문자가 삽입되거나 특정 문자가 치환이 일어나는 항목이다.

    • picture character-string에 B P V Z 9 0 / , . + - CR DB * cs symbol이 지정된다.

    • 다음과 같은 규칙이 적용되면 numeric-edited 항목이 된다.

      • BLANK WHEN ZERO clause이 지정되어 있는 경우

      • picture character-string에 B / Z 0 , . * + - CR DB cs symbol이 적어도 한 개 이상 지정되어 있는 경우

      • picture character-string에 + - CR DB symbol이 단 한 개만 지정되어 있는 경우

    • 최대 31자리 숫자 지정이 가능하다.

    • PICTURE의 최대 string갯수는 249를 넘어선 안된다.

    • USAGE DISPLAY를 지정했을 경우, VALUE clause에는 alphanumeric literal 이나 figurative constant를 지정해야 한다.

  • Alphanumeric

    • picture character-string이 X만 지정되어 있거나 X A 9가 혼용되어 지정되어 있는 항목이다. 항목의 값은 컴퓨터의 문자 셋에서 지정 가능한 모든 문자를 포함할 수 있다. item은 모든문자가 symbol X로 이루어져 있다고 간주한다.

    • Alphanumeric 항목은 USAGE DISPLAY가 명시적으로 지정하거나 암묵적으로 지정된 것으로 간주한다.

    • VALUE clause에 alphanumeric 문자를 지정하거나 ZERO, SPACE, QUOTE, HIGH-VALUE, LOW-VALUE, symbolic-character, ALL alphanemeric-literal 같은 Figurative constant를 지정할 수 있다.

  • Alphanumeric-edited

    • picture character-string에 A X 9 B 0 / 이 지정된다.

    • picture string은 최소 하나의 A 또는 X가 포함되어야 하며, 최소하나의 B나 0이나 /가 포함되어야 한다.

    • USAGE DISPLAY가 명시적으로 지정하거나 암묵적으로 지정된 것으로 간주한다.

    • VALUE clause에 Alphanumeric 문자를 지정하거나 ZERO, SPACE, QUOTE, HIGH-VALUE, LOW-VALUE, symbolic-character, ALL alphanemeric-literal 등과 같은 Figurative constant를 지정할 수 있다.

  • DBCS

    • picture character-string에 G symbol이 지정되어 있는 항목으로 한 개의 G에 해당 하는 문자 한개는 2bytes의 저장공간을 차지한다.

    • Picture paragraph에 G symbol이 지정된 경우는 USAGE DISPLAY-1를 명시적으로 지정하거나 암묵적으로 지정된 것으로 간주한다.

    • VALUE clause에는 DBCS literal이나 figurative constant SPACE 또는 figurative constant ALL DBCS-literal을 지정해야 한다.

  • External floating-point

    • external floating-point는 부호, 가수, E, 부호, 지수 형식으로 표시하는 부동소수점 표기법이다.

      image

      항목 설명

      + -

      • mantissa 왼쪽에 지정된 부호는 external floating-point의 부호를 지정하는 것으로 +는 양수 값을 의미하며 -는 음수 값을 의미한다.

      • exponent 왼쪽에 지정된 부호는 지수의 부호를 지정하는 것으로 +는 양수 지수값을 표현하며 -는 음수 값을 표현한다.

      • + 부호를 지정한 경우 : 양수 값을 표시할 때는 + 부호로, 음수 값을 표시할 때는 - 부호로 출력한다.

      • - 부호를 지정한 경우 : 양수 값을 표시할 때는 공백 문자로, 음수 값을 표시할 때는 -부호를 출력한다.

      mantisa

      • mantissa는 가수를 의미하며, 9 . V symbol을 사용할 수 있다.

      • V 또는 점(.) 중에 한 개를 지정해서 소수점을 표시해야만 한다.

      • 가수는 최대 16 문자까지 지정할 수 있다.

      E

      지수부의 시작을 의미한다.

      exponent

      지수부를 의미하며 99 형식으로 지정해야 한다.

    • USAGE DISPLAY를 지정하면 display floating-point 데이터 항목을 의미한다.

    • V를 제외한 모든 문자는 실제 저장공간을 차지한다.

    • OCCURS, REDEFINES, RENAME clause을 함께 지정할 수 있다.

    • BLANK WHEN ZERO, JUSTIFIED, VALUE clause은 함께 지정할 수 없다.

    • SIGN, SYNCHRONIZED clause을 지정한 경우는 해당 clause은 무시한다.

Alignment 규칙

Elementary item의 데이터 alignment는 데이터가 복사될 아이템의 카테고리에 따라 다음과 같은 규칙을 따른다.

  • Numeric

    • 데이터는 assumed decimal point를 기준으로 정렬되며 필요에 따라서는 truncation이나 0으로 padding이 발생한다.

    • Assumed decimal point가 지정되어 있지 않은 경우는 데이터 가장 오른쪽에 assumed decimal point가 지정되어 있다고 가정하고 데이터 정렬을 한다.

  • Numeric-edited

    • 소수점을 기준으로 데이터를 정렬하며, 필요에 따라서는 왼쪽 끝이나 오른쪽에서 truncation이나 0으로 padding이 발생한다.

  • Internal floating-point

    • 필드의 가장 왼쪽에 소수점이 있다고 가정하여, 이 소수점 다음에 숫자들이 왼쪽 정렬된다.

  • External floating-point

    • 데이터는 왼쪽 정렬되며, 정렬된 데이터에 따라 지수는 조정된다.

  • Alphanumeric, alphanumeric-edited, alphabetic, DBCS

    • 데이터는 왼쪽으로 정렬된다. 필요에 따라서는 truncation이나, 공백 padding이 발생한다.

    • JUSTIFIED clause가 지정되어 있는 경우, JUSTIFIED규칙에 따라 데이터 정렬이 발생한다.

문자열과 아이템의 크기

다음은 PICTURE clause, SIGN clause, USAGE clause에 따라 elementary item의 메모리의 크기를 비교한 설명이다.

USAGE clause 설명

USAGE DISPLAY

PICTURE에 지정한 한 개의 character-string 또는 SIGN IS SEPARATE가 지정되어 있는 경우 부호 기호가 1byte 메모리 공간을 차지한다.

USAGE DISPLAY-1

PICTURE에 지정한 한 개의 character-string이 2bytes 메모리 공간을 차지한다.

USAGE COMP, COMP-4, BINARY

USAGE clause의 Binary 형식의 데이터 항목의 크기를 참조한다.

USAGE COMP-1

4bytes

USAGE COMP-2

8bytes

USAGE COMP-3, PACKED-DECIMAL

USAGE clause의 PACKED-DECIMAL 형식의 데이터 항목의 크기를 참조한다.

USAGE COMP-5

USAGE clause의 native 형식의 데이터 항목의 크기를 참조한다.

부호 데이터

다음은 부호 데이터에 대한 설명이다.

부호 데이터 설명

연산 부호(Operational signs)

연산 부호는 부호있는 숫자 아이템에 붙는 부호를 의미하며, 수학적으로 +는 양의 값을 -는 음의 값의 속성을 가진다. 이 연산 부호의 내부 표현은 USAGE clause, SIGN clause 및 OS 환경에 따라 결정된다.

편집 부호(Editing sign)

numeric-edited 아이템에 지정한 부호로써 출력을 DISPLAY 구문 등을 사용해서 데이터를 출력하는 경우 출력되는 '+' 또는 '-' 보호를 의미한다.

PICTURE clause 편집

PICTURE clause 편집하는 방법은 다음과 같이 2가지가 있다.

  • 삽입편집

    • Simple insertion

      picture character-string에 지정한 문자가 데이터 항목 내에 동일한 위치에 동일한 문자가 삽입된다.

      alphanumeric-edited나 numeric-edited, DBCS 데이터 항목만 지정이 가 능하다.

      다음은 simple insertion 예제이다.

      picture 데이터 값 편집 결과

      X(10)/XX

      ALPHANUMER01

      ALPHANUMER/01

      X(5)BX(7)

      ALPHANUMERIC

      ALPHA NUMERIC

      99,B999,B000

      1234

      01, 234, 000

      99,999

      12345

      12,345

      GGBBGG

    • Special insertion

      numeric-edited나 external floating-point 데이터 항목에 사용 가능하다. 소수점을 표현하기 위한 데이터 항목에 점(.)이 삽입된다.

      picture 데이터 값 편집 결과

      999.99

      1.234

      001.23

      999.99

      12.34

      012.34

      999.99

      123.45

      123.45

      999.99

      1234.5

      234.50

      +999.99E+99

      12345

      +123.45E+02

    • Fixed insertion

      character string 내에 한 개의 통화 기호와 +, -, CR DB와 같은 부호를 지정할 수 있다.

      numeric-edited 데이터 항목에 사용 가능하다.

      • +, -와 같은 부호를 지정하지 않은 경우는 통화 기호가 character-string에 가장 왼쪽에 지정되어야 한다. +, - 부호가 지정되어 있는 경우는 부호는 character-string에 가장 왼쪽 혹은 가장 오른쪽에 지정되어야 한다.

      • CR DB는 character-string 내에 가장 오른쪽에 지정해야 하며 2bytes의 저장공간을 차지한다.

      다음은 Fixed insertion 편집 기호에 따른 데이터 항목의 결과값이다.

      편집기호 데이터 항목이 양수 혹은 0일 때의 결과값 데이터 항목이 음수일 때의 결과값

      +

      +

      -

      -

      스페이스

      -

      CR

      스페이스 * 2

      CR

      DB

      스페이스 * 2

      DB

      다음은 Fixed insertion 예제이다(b는 공백을 의미한다).

      picture character-string 데이터 값 결과값

      999.99+

      +6555.556

      555.55+

      +9999.99

      -6555.555

      -6555.55

      9999.99

      +1234.56

      1234.56

      $999.99

      -123.45

      $123.45

      -$999.99

      -123.45

      -$123.45

      -$999.99

      +123.456

      b$123.45

      $9999.99CR

      +123.45

      0123.45bb

      $9999.99CR

      -123.45

      $0123.45CR

    • Floating insertion

      Floating insertion은 numeric-edited 데이터 항목에 cs, +, -와 같은 부호를 지정할 수 있다.

      다음은 Floating insertion를 수행하는 방법에 대한 설명이다.

      1. 소수점 왼쪽 전부 혹은 일부를 floating insertion symbol을 지정하는 경우는 왼쪽에서 오른쪽으로 최초로 0이 아닌 숫자가 나온 바로 전에서 지정한 부호 문자 혹은 +, -의 insertion 편집이 발생한다. insertion 편집이 발생한 바로 전까지는 모두 공백이 삽입된다. 데이터 값의 소수점 오른쪽이 없는 경우는 insertion 문자만큼 0이 삽입된다. character-string을 모두 insertion 문자로 지정하는 경우는 적어도 한 개의 floating insertion symbol은 소수점의 왼쪽에 위치해야 한다.

      2. picture character-string이 모두 floating insertion symbol로 지정되어 있는 경우 데이터 값이 0인 경우는 picture character-string에 지정한 floating insertion symbol만큼 공백이 삽입된다. 데이터 값이 0이 아닌 경우는 1번에 의해 insertion 편집이 발생한다.

      다음은 Floating insertion 예제이다(b는 공백을 의미한다).

      picture character-string 데이터 값 결과값

      $$$$.99

      .123

      bbb$.12

      $$$9.99

      .12

      bb$0.12

      $,$$$,999.99

      -1234.56

      bbb$1,234.56

      +,+++,999.99

      -123456.789

      bb-123,456.78

      $$,$$$,$$$.99CR

      -1234567

      $1,234,567.00CR

      ++,+++,+++.+++

      0000.00

      bbbbbbbbbbbbbb

      ++,+++,+++.+++

      123456

      bbbb+12,345.000

  • Zero suppression과 치환 편집

    • Zero suppression과 치환 편집은 0이 아닌 숫자 왼쪽에 있는 0을 공백이나 *으로 편집되는 것으로 picture character-string에 Z * + - cs symbol을 지정한다. Z * + - cs symbol은 서로 혼용해서 지정할 수 없다.

    • 소수점 왼쪽에 일부 혹은 전부가 Zero suppression symbol로 지정되어 있는 경우, 가장 왼쪽의 0이 아닌 숫자 바로 전까지 Zero suppression 편집이 일어난다.

    • 소수점 왼쪽, 오른쪽 모두가 Zero suppression symbol로 지정이 되어 있고, 데이터 항목의 값이 0인 경우 지정한 Zero suppression symbol에 편집이 발생한다.

    • Zero suppression과 치환 편집은 다음의 규칙을 따른다.

      • Z symbol이 지정되어 있는 경우 데이터 항목에 모두 공백으로 채워진다.

      • * symbol이 지정되어 있는 경우 데이터 항목에 소수점 위치를 제외하고 모두 *으로 채워진다.

    • 다음은 Zero suppression 예제이다(b는 공백을 의미한다).

      picture character-string 데이터 값 결과값

      ****.**

      0000.00

      ****.**

      ZZZZ.ZZ

      0000.00

      bbbbbbb

      ZZZZ.99

      0000.00

      bbbb.00

      ****.99

      0000.00

      ****.00

      ZZ99.99

      0000.00

      bb00.00

      Z,ZZZ.ZZ+

      +123.456

      bb123.45+

      *,***.**+

      -123.45

      **123.45-

      **,***,***.**+

      +12345678.9

      12,345,678,90+

      $Z,ZZZ,ZZZ.ZZCR

      +12345.67

      $bbb12,345.67bb

      $B*,***,***.**BBDB

      -12345.67

      $b***12,345.67bbDB

3.8. REDEFINES clause

REDEFINES clause은 동일한 메모리 공간을 서로 다른 data description으로 재정의하는 것을 의미한다. 따라서 서로 다른 data description을 가진 데이터 항목이 동일한 메모리 공간을 점유하게 된다.

figure dd redefines
REDEFINES clause Format
  • data-name-1, FILLER

    • data-name-2에 의해 지정되 데이터 공간의 또 다른 data description으로 data-name-1을 redefining 항목 또는 REDEFINES subject라고 한다.

    • data-name-1뿐만 아니라 data-name-1에 종속된 항목은 VALUE clause를 설정하면 안된다.

    • data-name-1이나 FILLER가 명시되지 않았을 경우, REDEFINES clause는 level-number의 바로 뒤에 명시해야 한다.

  • data-name-2

    • data-name-2를 redefined 항목 또는 REDEFINES object라고 한다.

    • data-name-2는 REDEFINES clause을 지정할 수 있다. 그러나 OCCURS clause은 지정할 수 없다. 단, data-name-2의 상위 항목에는 OCCURS가 지정될 수 있다.

항목 설정은 다음의 규칙을 참고해서 지정한다.

  • data-name-1과 data-name-2 모두 OCCURS DEPENDING ON clause은 지정할 수 없다.

  • data-name-1과 data-name-2는 계층 구조상 동일 위치에 있어야 한다. 하지만 동일한 level number를 가질 필요는 없다.

  • data-name-1과 data-name2 모두 level-66, level-88은 지정할 수 없다.

  • data-name-1에 종속된 항목들은 모두 redefinition에 포함된다.

  • REDEFINES clause과 EXTERNAL clause은 동시에 지정할 수 없다.

REDEFINES clause 참고사항

REDEFINES clause를 설정할 때 참고할 사항에 대한 설명이다.

  • REDEFINES과 GLOBAL을 함께 지정한 경우, GLOBAL 속성은 redefining 데이터 항목만 가지게 된다.

  • EXTERNAL 절은 REDEFINES 절과 함께 지정해서는 안된다.

  • redefined 데이터 항목에 external 속성을 지정하는 경우 redefining 데이터 항목의 크기는 redefined 데이터 항목보다 크면 안된다.

  • redefining 항목의 데이터 사이즈가 redefined 항목의 데이터 사이즈보다 커도 상관은 없다.

  • redefined 항목과 redefining 항목은 연속되어야 한다. 즉, 두 항목 사이에 REDEFINES clause과 상관없는 항목을 기술해서는 안된다.

    그러나 다음과 같이 동일한 항목을 redefined하는 데이터가 연속되는 경우는 가능하다.

    05 ITEM-A PICTURE 999999.
    05 ITEM-B REDEFINES ITEM-A PICTURE 99999.
    05 ITEM-C REDEFINES ITEM-A PICTURE 99999.
  • redefined 항목과 redefining 항목의 USAGE clause는 동일할 필요는 없으며, 시로 다른 USAGE clause를 지정하더라도 데이터의 형식이나 내용은 변경되지 않는다.

  • redefined 항목을 redefining 항목에 move하거나 반대로 redefining 항목을 redefined 항목에 복사하는 경우는 정상적인 동작을 보장할 수 없다.

3.9. RENAMES clause

한 개 또는 여러 개의 데이터 항목을 그룹으로 지정해서 새로운 레코드 항목으로 정의하기 위해 지정한다.

RENAMES clause가 지정된 data description entry는 반드시 level-66으로 시작해야 한다. 한 개의 레코드에 대해서 여러 RENAMES 속성을 지정할 수 있다.

figure dd renames
RENAMES clause Format
  • data-name-1

    • 새롭게 그룹핑된 항목들을 식별하기 위한 식별자 이다.

    • level-66 항목은 level-01, level-77, level-88 또 다른 level-66 항목은 재정의할 수 없다. 또, data-name-2, data-name-3에는 OCCURS clause을 지정해서는 안된다.

    • data-name-1은 01-level entry로 qualified 될 수 있고, 다른 entry의 qualifier로는 사용될 수 없다.

  • data-name-2, data-name-3

    • data-name-2와 data-name-3는 각각 새롭게 그룹핑할 첫 번째 데이터 항목과 마지막 데이터 항목의 식별자로써 elementary 데이터 항목이나 alphanumeric 그룹 항목을 지정할 수 있다.

    • 두 data-name은 같은 항목을 나타내선 안되고, qualified 될 수 있다.

    • OCCURS clause가 지정되어 있거나, 상위 아이템에 OCCURS가 있는 data-name-2, data-name-3는 지정할 수 없다. 또한 data-name-2와 data-name-3 사이에 있는 항목은 OCCURS DEPENDING clause가 지정되어서는 안된다.

  • THRU

    • THROUGH의 약어이다.

주의 사항

data-name-2와 data-name-3를 기술한 경우 다음 사항은 주의해서 설정한다.

  • data-name-1은 다음의 규칙에 따라 data-name-2에서 시작해서 data-name-3까지의 항목을 포함한 alphanumeric 그룹 항목을 새롭게 정의한다.

    • data-name-2가 elementary 항목인 경우는 data-name-2을 시작 항목으로 설정한다.

    • data-name-2가 그룹 항목인 경우는 data-name-2에 속한 첫 번째 elementary 항목을 시작 항목으로 설정한다.

    • data-name-3가 elementary 항목인 경우는 data-name-3을 마지막 항목으로 설정한다.

    • data-name-3가 그룹 항목인 경우는 data-name-3에 속한 마지막 항목을 마지막 항목으로 설정한다.

  • 시작 항목에서 부터 마지막 항목까지 저장하고 있는 저장공간이 data-name-1이 점유하는 저장공간이 된다.

  • data-name-2가 data-name-3의 이전에 위치해야 한다.

  • data-name-3가 data-name-2에 완전히 종속된 서브 항목이 되어서는 안된다.

data-name-2만 기술한 경우 다음 사항은 주의해서 설정한다.

  • data-name-2가 점유하고 있는 저장공간이 data-name-1의 저장공간이 된다.

  • data-name-1은 data-name-2에 지정된 동일한 속성을 가진다.

  • data-name-2가 alphanumeric 그룹 항목인 경우는 data-name-1도 alphanumeric 그룹 항목이 된다.

  • data-name-2가 elementary 항목인 경우는 data-name-1도 elementary 항목이 된다.

3.10. SIGN clause

SIGN clause은 signed numeric 항목에 대해 부호의 표현 방법과 위치를 지정한다. picture character-string에 S symbol이 지정되어 있고 USAGE DISPLAY이 지정되어 있는 elementary numeric 항목에 지정하거나 이러한 속성을 가지고 있는 elementary 항목을 가지고 있는 그룹 항목에 지정할 수 있다.

figure dd sign
SIGN clause Format

SIGN clause이 그룹 항목과 그 그룹 항목에 속한 elementary 항목에 모두 지정되어 있을 때는 elementary 항목에 속한 SIGN clause이 우선된다. SEPARATE CHARACTER phrase가 지정되어 있는 경우는 picture character-string에 지정된 S symbol도 실제 저장공간을 1byte를 차지하게 된다.

3.11. SYNCHRONIZED clause

SYNCHRONIZED clause는 컴퓨터 스토리지 구조의 boundary에 맞게 사용하지 않는 slackbyte를 삽입하여 alignment를 조정해준다.

figure dd synchronized
SYNCHRONIZED clause Format

SYNC는 SYNCHRONIZED와 같은 표현이다. SYNCHRONIZED는 반드시요구되는것은 아니며, binary 항목을 사용할때의 퍼포먼스를 향상시키기 위해 사용된다. elementary 항목에 사용될 수 있다. LEFT/RIGHT는 프로그램의 실행에는 영향을 미치지 않는다.

다음은 SYNCHRONIZED가 다른 요소들에 미치는 영향이다.

  • OCCURS clause

    각각의 occurrence에 속성이 적용된다.

  • USAGE DISPLAY, PACKED-DECIMAL, COMP-3 ,DBCS, external floating point

    속성에 영향이 가지않는다.

  • USAGE COMP, COMP-4, COMP-5, BINARY

    REDEFINES clause를 갖고 있는 항목에 속하는 첫 elementary item이라면 추가적인 character position이 요구되지 않는다.

    SYNC가 subordinate 데이터 항목에 사용된것이 아니면, PICTURE clause가 S9 ~ s9(4)일 때 2배수의 alignment가 적용된다. S9(5) ~ S9(18)일 때는 4배수의 alignement displacement가 적용된다.

  • USAGE COMP-1

    데이터에 fullword boundary align이 적용된다.

  • USAGE COMP-2

    데이터에 doubleword boundary align이 적용된다.

  • REDEFINES clause

    REDEFINES clause의 object는 반드시 proper boundary alignment를 가져야 한다.

Slack byte

slack byte를 추가하는 룰은 다음과같다.

  • binary 이전의 모든 elementary 데이터 항목의 byte size를 더한 값을 s라고 한다.

  • 이 s를 m으로 나눈다. m은 길이 4 이하의 binary 항목일 경우 2, 4를 초과하는 binary 항목, COMP-1, INDEX, POINTER, PROCEDURE-POINTER, FUNCTION POINTER일 경우 4, COMP-2일 경우 8이다.

  • 이 연산의 나머지를 r이라하면, m - r만큼의 길이의 slack byte를 임의로 삽입한다.

다음은 SYNC를통해 Slack byte가 삽입되는 예제이다.

01 GROUP-A.
05 SUB-A PICTURE X(5).
05 SUB-B .
10 ELEM-A PICTURE X(2).
[ 10 SLACK-BYTES PICTURE X. (컴파일러가 삽입) ]
10 ELEM-B USAGE BINARY PICTURE S9(6) SYNC.

3.12. USAGE clause

USAGE clause은 메모리에 저장되는 표현되는 데이터 항목의 형식을 지정한다. 66, 88 level number 데이터 항목을 제외하고는 모든 데이터 항목에 지정할 수 있다. DATE FORMAT clause이 지정된 데이터 항목에서 대해서는 USAGE DISPLAY나 COMP-3만 지정 가능하다.

USAGE clause이 그룹 항목에 지정되어 있는 경우는 그 그룹에 속하는 elementary 데이터 항목로 상속된다. 단, elementary 항목에 USAGE를 명시하는 경우는 그룹 항목에 지정한 USAGE clause과 모순이 되어서는 안된다. USAGE clause이 지정되어 있지 않은 경우 아래와 같이 암묵적으로 USAGE clause이 지정된 것으로 간주한다.

picture character-string에 G 이외의 symbol이 지정되어 있는 경우는 USAGE DISPLAY가 지정된 것으로 간주한다.

figure dd usage
USAGE clause Format
Computational items

Computational item은 숫자 연산을 처리하기 위한 항목으로 numeric 카테고리 항목이어야 한다.

9 S V P symbol이 사용할 수 있는 symbol이다. 단, COMPUTATIONAL-1과 COMPUTATIONAL-2는 PICTURE 문자열을 지정할 수 없다.

Computational item의 최대 자릿수는 최대 31자리까지 표현할 수 있다.

  • BINARY

    • BINARY USAGE는 binary 데이터 항목을 표현한다. 음수의 표현은 동일한 값을 가지는 양수의 2의 보수법에 의해 표현된다.

    • USAGE clause에 지정한 BINARY, COMPUTATIONAL, COMP, COMPTATIONAL-4, COMP-4는 BINARY 데이터를 표현하는 동일한 방법이다.

    • BINARY 데이터는 big-endian으로써 부호있는 BINARY 데이터에 대해서 부호는 leftmost bit에 포함되어 있다.

    • BINARY 데이터의 메모리 저장공간은 다음 같이 PICTURE clause 지정에 따라 결정된다.

      PICTURE clause에 지정된 숫자 메모리 저장공간

      1 ~ 4

      2 bytes

      5 ~ 9

      4 bytes

      10 ~ 18

      8 bytes

  • PACKED-DECIMAL

    • internal decimal 항목으로 1byte 안에 두 개의 숫자가 저장되며, 마지막 byte의 4bits 내에는 부호가 저장된다.

    • PACKED-DECIAML, Computational-3, COMP-3는 모두 PACKED-DECIMAL 데이터를 표현하는 동일한 방법이다.

  • floating-point

    • single precision을 가지는 internal floating-point 항목으로 4 bytes 저장공간을 차지한다.

    • COMPUTATIONAL-1, COMP-1은 모두 internal floating-point 데이터를 표현하는 방법이다.

  • long floating-point

    • double precision을 가지는 internal floating-pointitem으로 8 bytes 저장공간을 차지한다.

    • COMPUTATIONAL-2, COMP-2는 모두 long floating-point 데이터를 표현하는 방법이다.

  • Native binary

    • USAGE COMP-5로 지정된 항목은 binary 데이터와 동일하게 저장공간에 표현된다.

      최대 자릿수는 USAGE COMP와 다르게 picture에 지정한 9의 개수에 따라 결정되는 것이 아니라 native binary 표현 한계에 따라 결정된다.

      COMP-5 데이터에 숫자를 저장하는 경우, truncation도 PICTURE clause에 지정에 따라 결정되는 것이 아니라 COMP-5 데이터가 표현할 수 있는 최댓값 또는 최솟값에 따라 truncation이 발생한다.

      COMP-5 데이터를 참조하는 경우는 native binary 표현 단위(2, 4, 8 bytes)로 참조된다.

    • 다음은 picture phrase의 지정에 따른 저장공간 및 저장할 수 있는 최댓값과 최솟값을 정리한 표이다.

      picture 저장공간 최댓값 또는 최솟값

      S9(1) ~ S9(4)

      2bytes

      -32,768 ~ +32,768

      S9(5) ~ S9(9)

      4bytes

      -2,147,483,648 ~ +2,147,483,647

      S9(10) ~ S9(18)

      8bytes

      -9,223,372,036,775,808 ~ +9,223,372,036,775,807

      9(1) ~ 9(4)

      2bytes

      0 ~ 65535

      9(5) ~ 9(9)

      4bytes

      0 ~ 4,294,967,295

      9(10) ~ 9(18)

      8bytes

      0 ~ 18,446,744,073,709,551,615

    • COMP-5 type은 주로 COBOL 프로그램이 아닌 프로그램과 데이터를 주고받을 때 사용되며, byte-order는 프로그램이 실행되는 컴퓨터의 byte-order와 동일하다.

    • COMP-5 데이터 항목으로 scaling factor를 표현할 수 있다. 예를 들어 PICTURE S99V99 COMP-5인 데이터가 있다면, 범위는 -327.68 ~ +327.67이다.

DISPLAY phrase

DISPLAY phrase는 데이터를 출력문자로 사용하기 위해 한 문자를 1byte에 저장공간에 저장한다.

다음의 카테고리 항목을 USAGE IS DISPLAY를 지정할 수 있다.

  • Alphabetic

  • Alphanumeric

  • Alphanumeric-edited

  • Numeric-edited

  • External floating-point

  • External decimal

    • External decimal 항목은 zoned decimal 항목이라고도 하며, 한 개의 숫자가 메모리 1byte를 차지하고 있다. 각 byte의 상위 4bits는 zone bits로 low-order byte의 zone bits는 해당 숫자의 부호를 나타낸다.각 byte의 하위 4bits는 숫자를 저장하고 있다.

    • External decimal 항목은 최대 31자리 숫자를 표현할 수 있다.

    • External decimal의 PICTURE character string으로는 9, S, V, P 만 사용할 수 있다.

DISPLAY-1 phrase

다음은 DISPLAY-1 phrase 설정 규칙이다.

  • DISPLAY-1 phrase는 DBCS 데이터 항목을 저장하기 위해 지정한다.

  • 한 문자는 저장공간에 2bytes를 차지한다.

INDEX phrase

다음은 INDEX phrase 설정 규칙이다.

  • INDEX phrase는 index 데이터 항목을 정의하며, index-name 값이 저장될 수 있다.

  • index 데이터 항목은 저장공간에 4bytes를 차지한다.

  • index 데이터 항목은 SEARCH, SET statement, 관계형 조건식, procedure division의 USING phrase, CALL이나 ENTRY statement의 USING phrase를 통해서만 값을 참조할 수 있다. 또는, alphanumeric 그룹의 하위 항목일 때는 MOVE statement이나 입/출력과 관련된 statement를 통해서 간접적으로 참조할 수 있다.

  • USAGE IS INDEX phrase는 어떤 레벨에도 지정가능하다. 만약, alphanumeric 그룹 항목에 INDEX phrase를 지정했을 경우 그 그룹 항목 자체는 index 데이터 항목이 아니기 때문에 SEARCH나 SET statement 또는 관계형 조건식을 사용할 수 없다. 그 그룹의 속한 elementary 항목이 index 데이터 항목이 되며, 해당 elementary 항목은 그 항목이 속한 그룹의 USAGE clause와 모순되는 USAGE clause는 지정할 수 없다.

  • USAGE IS INDEX는 DATE FORMAT, JUSTIFIED, PICTURE, BLANK WHEN ZERO, VALUE clause와 함께 사용할 수 없다. 단, SYNCHRONIZED는 index data과 함께 사용될 수 있다.

  • index 데이터 항목은 conditional variable이 될 수 없다.

POINTER Phrase

다음은 POINTER Phrase 설정 규칙이다.

  • POINTER phrase는 제한된 virtual storage를 address로 직접 조작하기 위한 POINTER 데이터 항목을 정의한다.

  • POINTER 데이터 항목은 저장공간에 4bytes를 차지한다.

  • POINTER 데이터 항목은 SEARCH, SET statement, 관계형 조건식, Procedure division의 USING phrase, CALL이나 ENTRY statement의 USING phrase를 통해서만 값을 참조할 수 있다.

  • USAGE IS POINTER clause는 88 레벨을 제외하고는 어떤 레벨의 항목에도 지정할 수 있다. USAGE IS POINTER clause이 그룹 항목에 지정한 경우 그룹에 속한 elementary 데이터 항목이 pointer 데이터 항목으로 그룹 자체는 alphanumeric 그룹 항목이 된다. 따라서, elementary 데이터 항목은 그 elementary 데이터 항목이 속한 그룹 항목과 모순되는 USAGE clause는 지정할 수 없다.

  • POINTER 데이터 항목은 MOVE statement이나 입출력과 관련된 구문에서 참조되는 그룹 항목에 종속된 항목으로 사용될 수 있다. 해당 구문이 수행될 때 어떠한 데이터 변환도 일어나지 않는다.

  • POINTER 데이터 항목은 Conditional variable이 될 수 없다.

  • USAGE IS POINTER는 DATE FORMAT, JUSTIFIED, PICTURE, BLANK WHEN ZERO clause와 함께 사용될 수 없다.

  • POINTER 데이터 항목은 redefined 혹은 redefining 항목이 될 수 있으며, SYNCHRONIZED clause와도 함께 사용할 수 있다. POINTER 데이터 항목에 VALUE clause로 지정할 수 있는 값은 NULL 또는 NULLS이다.

  • POINTER 데이터 항목은 조건변수로 사용 될 수 없으며, 데이터를 이동할 때 CORRESPONDING 대상에서 제외된다.

3.13. VALUE clause

VALUE clause은 데이터 항목의 초기값을 지정하거나 condition-name의 값을 지정한다. VALUE clause은 Data division section에 따라 사용이 달라진다.

VALUE clause를 linkage section이나 file section의 데이터 항목에 지정하는 경우는 컴파일러 내부적으로 condition-name entry를 제외하고는 문법 체크만 하고 처리는 하지 않는다.

working-storage section이나 local-storage section의 정의된 항목에 VALUE clause는 해당 데이터 항목의 condition-name entry 또는 초기값으로 사용된다. 프로그램이 실행 초기에 데이터 항목에 VALUE clause에 지정한 값이 저장된다. 만약, VALUE에 값을 지정하지 않은 경우는 프로그램 초기에 해당 데이터 항목의 저장된 값은 예측할 수 없다.

linkage section에 사용된 VALUE CLAUSE의 경우 주석 처리한다.

Format 1

Format 1은 데이터 항목에 지정할 초기값을 지정하는 형식이다.

figure dd literal value
VALUE clause Format 1 : literal value
  • VALUE

    • SPACE, ZERO와 같은 Figurative constant는 해당 Figurative constant가 의미하는 문자 또는 숫자로 치환된다.

    • numeric 항목에 지정하는 VALUE 값은 numeric이어야 한다. 만약, working-storage이나 local-storage의 항목에 VALUE 값을 지정하는 경우, 지정한 VALUE 값은 numeric move 규칙에 맞게 alignment 된다. 또한 0이 아닌 숫자의 truncation이 발생하는 VALUE 값은 지정해서는 안된다. 만약, VALUE 값에 부호가 있다면 picture character-string에 부호 기호를 지정해야 한다.

    • VALUE 값으로 지정하는 숫자는 PICTURE clause에 지정한 범위 안에 있는 숫자를 지정해야 한다.

      예를 들어 PICTURE 99PPP가 지정된 경우 1000에서 99000까지가 VALUE값으로 지정 가능하다. 단, COMP-5는 PICTURE clause에 P를 지정할 수 없다.

      또한, picture character-string에 관계없이 native binary 표현 범위까지 VALUE 값을 지정할 수 있다.

    • USAGE DISPLAY가 지정된 alphabetic, alphanumeric, alphanumeric-edited, numeric-edited 항목에 VALUE 값을 지정하는 경우, 지정 가능한 VALUE 값은 alphanumeric 리터럴이나 Figurative constant이며, 지정한 문자의 크기는 항목의 크기를 초과해서는 안된다.

      또한, 지정한 VALUE 값은 alphanumeric 정렬 규칙에 따라 정렬되어 진다.

    • alphanumeric 그룹에 VALUE 값을 지정하는 경우 VALUE 값은 alphanumeric 리터럴이나 Figurative constant이여야 하며, 지정한 문자의 크기는 그룹 항목의 크기를 초과해서는 안된다.

    • DBCS 항목에 VALUE 값을 지정하는 경우는 DBCS 리터럴, SPACE, ALL DBCS 리터럴이여야 한다. 또한, 지정한 문자의 크기는 데이터 항목의 크기를 초과해서는 안된다.

    • internal floating-point인 COMP-1, COMP-2 항목에 VALUE 값을 지정하는 경우, VALUE 값은 floating-point 리터럴이나 figurative constant ZERO 또는 소수점 없는 0 또는 소수점이 있는 0을 지정해야 한다.

다음은 literal value의 설정 규칙이다.

  • 초기화는 BLANK WHEN ZERO나 JUSTIFIED clause와는 독립적이다.

  • OCUURS clause가 지정되어 있거나 테이블 항목의 서브 항목에 format 1형식의 VALUE clause이 지정된 경우 해당 테이블의 모든 element에 VALUE clause에 지정된 값이 적용된다.

  • PICTURE clause의 edited chracters의 기능은 초기값을 결정하는데 무시된다. 단, 항목의 크기를 결정하는 edited chracters는 초기값을 결정하는데 표함된다. 즉 PICTURE clause에 edited characters가 포함되어있으면 VALUE literal에 editing characters가 포함되어야된다. 예를 들면 PIC +999.99가 있고, 원하는 value가 +12.34라면 VALUE clause에선 이를 VALUE "+012.34".로 지정해야 한다.

  • VALUE clause은 EXTERNAL 또는 REDEFINES clause과 지정해서는 안되고, 해당 clause를 갖고 있는 것의 subordinate entry여서도 안된다. 이 룰은 condition-name entry에는 해당이 안된다.

  • alphanumeric 그룹 항목, elementary 데이터 항목에 지정할 수 있다. 그룹 레벨에 VALUE clause 지정되어 있는 경우 그 그룹에 속해 있는 elementary 데이터 항목의 타입에 관계 없이 동일한 값으로 초기화가 이루어진다. 그룹 항목에 VALUE clause이 지정되어 있는 경우 그 그룹에 속한 elementary 데이터 항목에는 VALUE clause을 지정할 수 없다.

  • JUSTIFIED 또는 SYNCHRONIZED clause가 지정되어 있는 항목을 가지고 있는 그룹 항목에는 VALUE clause을 지정해서는 안된다.

  • alphanumeric 그룹 항목에 VALUE clause을 지정한 경우는 그 그룹에 속한 모든 항목은 명시적으로 USAGE DISPLAY를 지정하거나 암묵적으로 USAGE DISPLAY가 지정되어 있는것으로 간주한다.

VALUE clause은 external floating-point 항목에는 지정할 수 없다.

Format 2

Format 2는 condition-name에 리터럴로 지정한 한 개의 Value 값 또는 여러 개의 Value 값이나 범위를 지정하는 형식이다.

figure dd condition name value
VALUE clause Format 2 : condition-name value

서로 다른 condition-name에 값을 지정하는 경우 별도의 88 레벨로 entry를 지정해야 한다.

항목 설명

condition-name-1

조건변수와 value 값을 연결하는 사용자 정의 이름이다.

조건변수 테이블 항목인 경우 조건변수를 참조할 때와 동일하게 condition-name도 subscript나 index를 통해서 참조해야 한다.

literal-1

condition-name과 연결되는 단일 value 값이다.

literal-1 through literal-2

literal-1에서 literal-2까지 값을 condition-name과 연결시키는것으로써 literal-1과 literal-2는 동일한 class여야만 한다. literal-1은 literal-2보다 작아야한다.

조건변수가 DBCS인 경우는 literal-1과 literal-2도 DBCS literal이어야 하며, Figurative constant나 ALL DBCS 리터럴을 지정 가능하다.

literal-1과 literal-2가 DBCS인 경우, THROUGH phrase로 지정된 DBCS 값의 범위는 16진수 DBCS 값들의 binary collating sequence에 따른다.

다음은 condition-name entry 설정 규칙이다.

  • condition-name entry를 지정하기 위해서는 반드시 조건변수 entry가 먼저 지정되어야 한다.

    한 개의 조건변수에 대해서 여러 개의 condition-name entry를 지정하는 경우는 각각의 condition-name entry를 연속해서 지정해야 하며, 각각의 condition-name entry는 점(.)으로 구분되어야 한다.

  • THRU는 THROUGH의 생략형이다.

  • 아래와 같은 경우를 제외하고는 어떠한 elementary 데이터 항목도 조건변수로 사용할 수 있다.

    • 다른 조건변수의 condition-name인 경우

    • RENAMES clause이 지정된 경우

    • USAGE INDEX, USAGE POINTER, USAGE PROCEDURE-POINTER, USAGE FUNCTION-POINTER가 지정된 경우

  • condition-name은 그룹 레벨이나 그룹의 하위 레벨에 지정할 수 있다.

  • condition-name이 alphanumeric 그룹 데이터에 지정되었을 경우 literal-1또는 literal-2는 alphanumeric 리터럴 또는 Figurative constant를 지정해야 한다. 그룹에 속한 항목에 지정할 수 있는 usage는 제한은 없다.

  • condition-name이 alphanumeric 그룹 데이터에 지정되었을 경우 지정한 값의 크기는 그룹 내의 모든 항목의 크기의 합을 초과해서는 안되며, 그 그룹 내의 항목에는 JUSTIFIED나 SYNCHRONIZED는 지정해서는 안된다.

  • VALUE clause에DBCS literal이 지정된 경우, 연관된 condition-name은 동일한 class 여야 한다.

Format 3

Format 3는 USAGE POINTER, USAGE PROCEDURE-POINTER, USAGE FUNCTION-POINTER로 지정된 항목의 초기값으로 null 값을 지정하는 형식이다.

figure dd null value
VALUE clause Format 3 : NULL value