Files
cobol-tna-system/品質管理/COBOL言語解説書_IBM_zOS_V65.md

1427 lines
41 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# COBOL言語解説書
## ドキュメント情報
- **タイトル**: Enterprise COBOL for z/OS 6.5 Language Reference
- **出版番号**: SC27-8713-04
- **ページ数**: 916
- **日本語訳題**: COBOL言語解説書
- **ベース**: IBM Enterprise COBOL for z/OS V6.5 (プログラム番号 5655-EC6)
---
# 第1部: COBOL言語構造
## 1.1 文字セットとコードページ
### 基本COBOL文字セット
COBOLの基本文字セットは、ラテンアルファベットの大文字・小文字、数字、および特殊文字で構成される。
| 文字 | 意味 | 使用例 |
|------|------|--------|
| スペース | 区切り文字 | `01 WS-A PIC X(10).` |
| `+` | 算術演算子、編集文字 | `COMPUTE WS-A = B + C.` |
| `-`(ハイフン) | 算術演算子、編集文字、継続文字、COBOL語要素 | `COMPUTE WS-A = B - C.` |
| `*`(アスタリスク) | 算術演算子、編集文字、注釈文字 | `* THIS IS COMMENT` |
| `/`(スラッシュ) | 算術演算子、編集文字、継続文字 | `PIC 99/99/99.` |
| `=` | 代入文字、関係文字 | `COMPUTE A = B.` |
| `$` | 通貨記号(編集文字) | `PIC $$99.` |
| `,`(カンマ) | 編集文字、区切り文字 | `PIC 99,999.` |
| `;`(セミコロン) | 区切り文字 | `MOVE 10 TO A; B.` |
| `:`(コロン) | 関係文字、修飾演算子 | `MOVE VAR(1:10) TO V.` |
| `.`(ピリオド) | 小数点、区切り文字 | `MOVE 10 TO A, B.` |
| `"`(引用符) | 英数字リテラルの区切り | `VALUE "HELLO".` |
| `'`(アポストロフィ) | 英数字リテラルの区切り | `VALUE 'HELLO'.` |
| `(` `)` | 括弧(区切り文字) | `IF (A = 10) AND (B = 5)` |
| `>` `<` | 関係文字 | `IF A > 10` |
| `_`(アンダースコア) | ユーザ定義語要素 | `01 WS_VAR PIC X(10).` |
| `A-Z` / `a-z` | アルファベット(英字) | |
| `0-9` | 数字 | |
### コードページ
コードページ(コード化文字セット)とは、各文字に数値位置(コードポイント)を割り当てた符号化表現のこと。IBMの各コードページはコードページ名(例:IBM-1252)とCCSID(例:1252)で識別される。
**Enterprise COBOLのコードページ関連機能**:
- `CODEPAGE`コンパイラオプションで使用するコードページを指定
- デフォルトのコードページは IBM-1140CCSID 1140
- ナショナルリテラルおよびUSAGE NATIONALのデータは UTF-16BECCSID 1200)で符号化
- UTF-8リテラルおよびUSAGE UTF-8のデータは UTF-8CCSID 1208)で符号化
**文字符号化単位(エンコーディングユニット)**:
| USAGE / カテゴリ | エンコーディング単位 |
|-----------------|---------------------|
| DISPLAY(英数字) | 1バイト |
| DISPLAY-1DBCS | 2バイト |
| NATIONAL | 2バイト |
| UTF-8 | 1バイト |
**ランタイムコードページの種類**:
- シングルバイトEBCDIC
- EBCDIC DBCSShift-Out/Shift-Inで区切られた2バイト文字)
- Unicode UTF-16
- Unicode UTF-8
---
## 1.2 文字列(COBOL語とリテラル)
文字列(character-string)とは、COBOL語、リテラル、PICTURE文字列、または注釈項目を形成する連続した文字のこと。文字列は区切り文字(separator)によって区切られる。
### COBOL予約語
予約語はCOBOLソースユニット内で事前定義された意味を持つ文字列。6つのタイプがある:
1. **キーワード** — 特定の句、項目、文で必須の語
2. **オプション語** — 可読性向上のための省略可能な語
3. **FIGURATIVE CONSTANT figurative constants** — ZERO, SPACE等
4. **特殊文字語** — 算術演算子(+ - / * **)、関係演算子(< > = <= >=)、浮動注釈指示子(\*>)、疑似テキスト区切り(==)、コンパイラ指示子指示記号(>>)
5. **特殊オブジェクト識別子** — SELF, SUPER
6. **特殊レジスタ** — ADDRESS OF, RETURN-CODE等
### ユーザ定義語
ユーザが指定するCOBOL語。最大30バイト。以下の文字を使用可能:
- ラテン大文字 AZ
- ラテン小文字 az
- 数字 09
- ハイフン(-):先頭・末尾不可
- アンダースコア(_):先頭不可
**ユーザ定義語の種類とDBCS許容**:
| 種類 | DBCS許容 |
|------|----------|
| Alphabet-name(アルファベット名) | 可 |
| Class-name(クラス名) | 可 |
| Condition-name(条件名) | 可 |
| Data-name(データ名) | 可 |
| File-name(ファイル名) | 可 |
| Function-name(関数名) | 不可 |
| Index-name(インデックス名) | 可 |
| Level-number(レベル番号01-49, 66, 77, 88 | 不可 |
| Library-name(ライブラリ名) | 不可 |
| Mnemonic-name(ニモニック名) | 可 |
| Paragraph-name(段落名) | 可 |
| Program-name(プログラム名) | 不可 |
| Record-name(レコード名) | 可 |
| Section-name(節名) | 可 |
| Symbolic-character(記号文字) | 可 |
| Text-name(テキスト名) | 不可 |
| Type-name(型名) | 可 |
| XML-schema-nameXMLスキーマ名) | 可 |
### システム名
システムに対して特定の意味を持つ文字列。3タイプ:
- Computer-name(計算機名)
- Language-name(言語名)
- Implementor-name(実装者名):Environment-name, External-class-name, External-fileid, Assignment-name
### FIGURATIVE CONSTANTS figurative定数)
| 定数 | 意味 |
|------|------|
| ZERO, ZEROS, ZEROES | 数値0、または文字'0'の1回以上の出現 |
| SPACE, SPACES | 1つ以上のブランク(空白) |
| HIGH-VALUE, HIGH-VALUES | 使用中の照合順序で最上位の文字 |
| LOW-VALUE, LOW-VALUES | 使用中の照合順序で最下位の文字 |
| QUOTE, QUOTES | 引用符文字またはアポストロフィ文字 |
| ALL literal | リテラルの文字列を1回以上繰り返したもの |
| NULL, NULLS | POINTER/PROCEDURE-POINTER等の無効アドレスを示す値 |
| symbolic-character | SYMBOLIC CHARACTERS句で定義された文字 |
### 特殊レジスタ一覧
特殊レジスタは、コンパイラが生成するストレージ領域を名前で参照するための予約語。
| 特殊レジスタ | 暗黙定義 | 用途 |
|-------------|----------|------|
| ADDRESS OF | USAGE POINTER | LINKAGE/LOCAL/WORKING-STORAGE項目のアドレス参照 |
| DEBUG-ITEM | 01グループ(6サブフィールド) | デバッグ宣言手続きへの情報提供 |
| IGY-JAVAIOP-CALL-EXCEPTION | PIC 9(9)/9(18) COMP-5 | Java静的メソッド呼出時の例外オブジェクト参照 |
| JNIENVPTR | USAGE POINTER | JNI環境ポインタ参照 |
| JSON-CODE | PIC S9(9) BINARY | JSON GENERATE/PARSEの成功/例外コード |
| JSON-STATUS | PIC S9(9) BINARY | JSON PARSEの非例外状態コード |
| LENGTH OF | PIC 9(9)/9(18) BINARY | データ項目の現在バイト長 |
| LINAGE-COUNTER | 可変(LINAGE句依存) | 現在ページ内の行番号 |
| RETURN-CODE | PIC S9(4) BINARY GLOBAL | 呼出元へのリターンコード |
| SHIFT-OUT / SHIFT-IN | PIC X(1) DISPLAY | EBCDICシフトアウト/シフトイン制御文字 |
| SORT-CONTROL | PIC X(8) DISPLAY | ソート制御文のDD名 |
| SORT-CORE-SIZE | PIC S9(8) BINARY | ソートユーティリティが使用可能なストレージ量 |
| SORT-FILE-SIZE | PIC S9(8) BINARY | ソート入力ファイルの推定レコード数 |
| SORT-MESSAGE | PIC X(8) DISPLAY | ソートメッセージ出力先DD名 |
| SORT-MODE-SIZE | PIC S9(5) BINARY | 可変長レコードの最頻長 |
| SORT-RETURN | PIC S9(4) BINARY | ソート/マージ完了コード(0=成功, 16=失敗) |
| TALLY | PIC 9(5) BINARY GLOBAL | 計数用(参照・変更可能) |
| WHEN-COMPILED | PIC X(16) DISPLAY | コンパイル開始日時(MM/DD/YYhh.mm.ss |
| XML-CODE | PIC S9(9) BINARY | XML GENERATE/PARSEのステータスコード |
| XML-EVENT | PIC X(30) DISPLAY | XMLパースイベント名 |
| XML-INFORMATION | PIC S9(9) BINARY | XMLイベントの追加情報 |
| XML-NAMESPACE / XML-NNAMESPACE | 英数字/ナショナル | XML名前空間識別子 |
| XML-NAMESPACE-PREFIX / XML-NNAMESPACE-PREFIX | 英数字/ナショナル | XML名前空間プレフィックス |
| XML-NTEXT | ナショナル | XML文書断片(NATIONAL |
| XML-TEXT | 英数字(可変長) | XML文書断片(DISPLAY |
### リテラル
リテラルは、その構成文字またはFIGURATIVE CONSTANTの使用によって値が指定される文字列。
**英数字リテラル(Alphanumeric Literals**:
- 基本形式: `"文字列"` または `'文字列'`
- 最大長: 160バイト、最小長: 1バイト
- 16進表記: `X"hex"` または `X'hex'`
- NULL終端: `Z"文字列"` または `Z'文字列'`
- DBCS文字を含む英数字リテラルは継続不可
**DBCSリテラル**:
- 形式: `G"<DBCS文字>"` または `G'<DBCS文字>'`
- 最大長: 28文字
- 継続不可
**UTF-8リテラル**:
- 基本形式: `U"文字データ"` または `U'文字データ'`
- Unicodeエスケープシーケンス対応: `\uhhhh` (BMP), `\U00hhhhh` (追加面)
- 16進表記: `UX"hex"` または `UX'hex'`
**数値リテラル**:
- 数字0-9、符号(+/-)、小数点で構成
- 整数: 118桁(ARITH(COMPAT)時)または131桁(ARITH(EXTEND)時)
- 浮動小数点: 仮数部に小数点必須、指数部はE+/-nn
**ナショナルリテラル**:
- NSYMBOL(NATIONAL)時: `N"文字データ"` または `N'文字データ'`
- 最大長: 80文字位置
- 16進表記: `NX"hex"` または `NX'hex'`
- UTF-16(ビッグエンディアン)に自動変換
---
## 1.3 区切り文字(Separators
| 区切り文字 | 意味 |
|-----------|------|
| スペース(b) | 語の区切り |
| `,b`(カンマ+スペース) | 区切りカンマ |
| `.b`(ピリオド+スペース) | 区切りピリオド(文の終端) |
| `;b`(セミコロン+スペース) | 区切りセミコロン |
| `:` | コロン |
| `::` | 修飾演算子 |
| `(` `)` | 括弧 |
| `"..."` | 引用符(英数字リテラル区切り) |
| `'...'` | アポストロフィ(英数字リテラル区切り) |
| `==...==` | 疑似テキスト区切り |
| `U"` / `U'` | UTF-8リテラル開始区切り |
| `UX"` / `UX'` | UTF-8 16進リテラル開始区切り |
| `X"` / `X'` | 英数字16進リテラル開始区切り |
| `Z"` / `Z'` | NULL終端英数字リテラル開始区切り |
| `N"` / `N'` | ナショナル/DBCSリテラル開始区切り |
| `NX"` / `NX'` | ナショナル16進リテラル開始区切り |
| `G"` / `G'` | DBCSリテラル開始区切り |
---
## 1.4 参照形式(Reference Format
COBOLソーステキストは72桁の行内で以下の領域に分けられる:
| 領域 | 桁 | 内容 |
|------|-----|------|
| Sequence number area | 16 | 行番号(任意) |
| Indicator area | 7 | 指示子 |
| Area A | 811 | 特定の要素の開始位置 |
| Area B | 1272 | エントリ、文、句など |
**Area Aに記述するもの**:
- 区分ヘッダ(IDENTIFICATION/ENVIRONMENT/DATA/PROCEDURE DIVISION.
- 節ヘッダ
- 段落ヘッダ、段落名
- レベル指示子(FD, SD)、レベル番号01、77
- DECLARATIVES / END DECLARATIVES
- プログラム/クラス/メソッド終了マーカ
**Area Bに記述するもの**:
- エントリ、文、句
- 継続行
**指示子領域(Column 7)の用途**:
- `-`(ハイフン): 継続行
- `*`(アスタリスク): 注釈行
- `/`(スラッシュ): 改ページ+注釈行
- `D` / `d`: デバッグ行
---
# 第2部: COBOLプログラム構造
## 2.1 4つのDIVISION
COBOLソースプログラムは以下の4つの区分(division)から構成される:
### IDENTIFICATION DIVISION(識別区分)
プログラムの識別情報を定義する必須区分。
**主要な段落**:
- `PROGRAM-ID. program-name.` — プログラム名(必須)
- `CLASS-ID. class-name INHERITS class-name.` — クラス定義
- `FUNCTION-ID. function-name.` — ユーザ定義関数
- `METHOD-ID. "method-name".` — メソッド定義
### ENVIRONMENT DIVISION(環境区分)
プログラムの実行環境に依存する側面を記述する。
**CONFIGURATION SECTION**:
- SOURCE-COMPUTET. source-computer-name
- OBJECT-COMPUTER. object-computer-name
- SPECIAL-NAMES.(特殊名)
- REPOSITORY.(リポジトリ)
**INPUT-OUTPUT SECTION**:
- FILE-CONTROL.(ファイル制御)
- I-O-CONTROL.(入出力制御)
### DATA DIVISION(データ区分)
プログラムで処理されるすべてのデータを構造化して記述する。
**FILE SECTION**(ファイル節) — データファイルの構造を定義
**WORKING-STORAGE SECTION**(作業格納節) — 内部データ
**LOCAL-STORAGE SECTION**(局所格納節) — 呼出毎に再割当てされるデータ
**LINKAGE SECTION**(連絡節) — 他プログラムから受け渡されるデータ
### PROCEDURE DIVISION(手続き区分)
実行可能な処理を記述する。
---
## 2.2 ネストプログラム
COBOLプログラムは他のCOBOLプログラムを内部に含むことができる。これらを含まれるプログラムをネストプログラムと呼ぶ。
- 直接含まれる(directly contained: プログラムBがプログラムA内に直接ある場合
- 間接的に含まれる(indirectly contained: プログラムBがプログラムA内の別のプログラムCに含まれる場合
- 兄弟プログラム(sibling): 同じプログラムに直接含まれるプログラム同士
- COMMON属性: ネストプログラムで指定でき、それを含むプログラムとその兄弟から参照可能
---
## 2.3 クラス定義/メソッド定義/ユーザ定義関数
### クラス定義
オブジェクト指向COBOLのための構造。Javaとの相互運用を目的とする。
```
IDENTIFICATION DIVISION.
CLASS-ID. class-name INHERITS superclass.
ENVIRONMENT DIVISION.
...CONFIGURATION SECTIONのみ)
FACTORY.(ファクトリ定義:静的メソッド+静的データ)
OBJECT.(オブジェクト定義:インスタンスメソッド+インスタンスデータ)
END CLASS class-name.
```
### メソッド定義
クラス内のメソッドは独立した`METHOD-ID`で識別される。`GOBACK`で終了。
### ユーザ定義関数
`FUNCTION-ID`で定義。`RETURNING`句で戻り値を指定。
---
# 第3部: ENVIRONMENT DIVISION詳細
## 3.1 CONFIGURATION SECTION(構成節)
### SOURCE-COMPUTER段落
```
SOURCE-COMPUTER. computer-name WITH DEBUGGING MODE.
```
### OBJECT-COMPUTER段落
```
OBJECT-COMPUTER. computer-name
MEMORY SIZE integer WORDS/CHARACTERS/MODULES
PROGRAM COLLATING SEQUENCE IS alphabet-name
SEGMENT-LIMIT IS priority-number.
```
### SPECIAL-NAMES段落
```
SPECIAL-NAMES.
implementor-name IS mnemonic-name
alphabet-name IS ...
CLASS class-name IS ...
CURRENCY SIGN IS literal
DECIMAL-POINT IS COMMA
SYMBOLIC CHARACTERS ...
XML-SCHEMA ...
```
**主な句**:
| 句 | 機能 |
|----|------|
| ALPHABET句 | 文字セット/照合順序の定義(EBCDIC, ASCII, STANDARD-1/2, ユーザ定義) |
| CLASS句 | 文字の分類定義(例:CLASS VALID-CHAR IS 'A' THRU 'Z' |
| CURRENCY SIGN句 | 通貨記号の変更 |
| DECIMAL-POINT IS COMMA | ピリオドとカンマの機能交換 |
| SYMBOLIC CHARACTERS句 | ユーザ定義FIGURATIVE CONSTANTの作成 |
| XML-SCHEMA句 | XMLスキーマファイルの指定 |
### REPOSITORY段落
クラス名とその外部クラス名の対応付け、ユーザ定義関数のプロトタイプ参照を行う。
```
REPOSITORY.
CLASS class-name IS external-class-name
FUNCTION function-name
FUNCTION ALL INTRINSIC.
```
---
## 3.2 INPUT-OUTPUT SECTION(入出力節)
### FILE-CONTROL段落
```
FILE-CONTROL.
SELECT file-name ASSIGN TO assignment-name
ORGANIZATION IS SEQUENTIAL/INDEXED/RELATIVE
ACCESS MODE IS SEQUENTIAL/RANDOM/DYNAMIC
RECORD KEY IS data-name
ALTERNATE RECORD KEY IS data-name
RELATIVE KEY IS data-name
FILE STATUS IS data-name
RESERVE integer AREAS
PADDING CHARACTER IS data-name
RECORD DELIMITER IS STANDARD-1.
```
| 句 | 機能 |
|----|------|
| SELECT / ASSIGN | ファイルと外部名の関連付け |
| ORGANIZATION | ファイル編成(SEQUENTIAL/INDEXED/RELATIVE |
| ACCESS MODE | アクセスモード(SEQUENTIAL/RANDOM/DYNAMIC |
| RECORD KEY | 索引ファイルの主レコードキー |
| ALTERNATE RECORD KEY | 代替レコードキー |
| RELATIVE KEY | 相対ファイルのキー |
| FILE STATUS | ファイルステータスを受け取るデータ項目 |
| RESERVE | バッファ領域数 |
### I-O-CONTROL段落
```
I-O-CONTROL.
RERUN ON assignment-name EVERY integer RECORDS
SAME AREA FOR file-name
SAME RECORD AREA FOR file-name
SAME SORT AREA FOR file-name
MULTIPLE FILE TAPE CONTAINS file-name
APPLY WRITE-ONLY ON file-name.
```
---
# 第4部: DATA DIVISION詳細
## 4.1 ファイル記述(FD
```
FD file-name
BLOCK CONTAINS integer-1 TO integer-2 RECORDS/CHARACTERS
RECORD CONTAINS integer-1 TO integer-2 CHARACTERS
LABEL RECORDS ARE STANDARD/OMITTED
VALUE OF data-name IS literal
DATA RECORDS ARE record-name
LINAGE IS data-name/integer LINES
WITH FOOTING AT data-name/integer
LINES AT TOP data-name/integer
LINES AT BOTTOM data-name/integer
RECORDING MODE IS F/V/U/S
CODE-SET IS alphabet-name
EXTERNAL / GLOBAL.
```
| 句 | 機能 |
|----|------|
| BLOCK CONTAINS | 物理ブロックサイズ |
| RECORD CONTAINS | 論理レコードサイズ |
| LABEL RECORDS | ラベル処理(STANDARD/OMITTED |
| VALUE OF | ラベル内の識別情報 |
| LINAGE | ページ行数制御(帳票出力用) |
| CODE-SET | コードページ変換の指定 |
**LINAGE句**:
- LINAGE-COUNTER特殊レジスタが自動生成される
- `WRITE`文実行時に自動更新
- 初期値は1
---
## 4.2 データ記述項目
### レベルの概念
| レベル番号 | 用途 |
|-----------|------|
| 01 | レコード自体(Area Aに記述) |
| 02~49 | グループ項目、基本項目 |
| 66 | RENAMES句用 |
| 77 | 独立項目(WORKING-STORAGE等、Area Aに記述) |
| 88 | 条件名(VALUE句と共に使用) |
### PICTURE句
PICTURE文字列でデータ項目の特性と編集要件を指定する。
**PICTURE記号一覧**:
| 記号 | 意味 | サイズ算定 |
|------|------|-----------|
| A | 英字またはスペースのみ | 1文字位置 |
| B | スペース挿入 | 1文字位置 |
| E | 外部浮動小数点の指数開始 | 1文字位置 |
| G | DBCS文字位置 | 1文字位置 |
| N | DBCS/ナショナル文字位置 | 1文字位置 |
| P | 仮定小数点スケーリング位置 | カウントされない |
| S | 符号の存在 | カウントされない(SEPARATE時は1) |
| U | UTF-8文字位置 | 1文字位置 |
| V | 仮定小数点の位置 | カウントされない |
| X | 任意の英数字文字 | 1文字位置 |
| Z | 先頭ゼロ置換(スペース) | 1文字位置 |
| 9 | 数字 | 1桁 |
| 0 | ゼロ挿入 | 1文字位置 |
| / | スラッシュ挿入 | 1文字位置 |
| , | カンマ挿入 | 1文字位置 |
| . | 実小数点(編集) | 1文字位置 |
| + / - | 編集符号制御 | 1文字位置 |
| CR / DB | 編集符号制御 | 2文字位置 |
| * | チェックプロテクト | 1文字位置 |
| cs | 通貨記号 | 1+文字位置 |
**データカテゴリ**:
| カテゴリ | PICTURE記号 |
|---------|-------------|
| Alphabetic | Aのみ |
| Alphanumeric | X、またはA/X/9の組合せ |
| Alphanumeric-edited | A X 9 B 0 /(少なくとも1つのA/Xと1つのB/0// |
| DBCS | G、G B、NNSYMBOL(DBCS)時) |
| External floating-point | +9.9E+99形式 |
| National | NNSYMBOL(NATIONAL)時) |
| National-edited | N B 0 / |
| Numeric | 9 S V P |
| Numeric-edited | 数値編集記号 |
| UTF-8 | U |
**編集の種類**:
- 単純挿入編集: B, 0, /
- 特殊挿入編集: .(実小数点)
- 固定挿入編集: +, -, CR, DB, cs(通貨記号)
- 浮動挿入編集: +, -, cs(複数回指定)
- ゼロ抑制/置換編集: Z, *
---
### OCCURS句(表定義)
固定長表:
```
05 item OCCURS integer TIMES
ASCENDING/DESCENDING KEY IS data-name
INDEXED BY index-name
PIC X(10).
```
可変長表(ODO: OCCURS DEPENDING ON:
```
05 item OCCURS integer-1 TO integer-2 TIMES
DEPENDING ON data-name
PIC X(10).
```
無制限表(UNBOUNDED:
```
05 item OCCURS 1 TO UNBOUNDED TIMES
DEPENDING ON data-name
PIC X(10).
```
### REDEFINES句
同一ストレージ領域の再定義。レベル番号が同じでなければならない。
```
01 WS-EMPLOYEE.
05 WS-EMP-NAME PIC X(30).
05 WS-EMP-SALARY PIC 9(5)V99.
01 WS-EMP-ALT REDEFINES WS-EMPLOYEE.
05 WS-EMP-CODE PIC X(10).
05 WS-EMP-DEPT PIC X(25).
```
### RENAMES句(レベル66
既存データ項目の再グループ化。レベル66で指定。
```
66 WS-RENAME-EMP RENAMES WS-FIRST-NAME THRU WS-LAST-NAME.
```
### USAGE句
データ項目の内部表現を指定。
| USAEGE句 | 説明 |
|---------|------|
| DISPLAY | ディスプレイ形式(標準) |
| DISPLAY-1 | DBCSデータ |
| COMP / COMP-4 / BINARY | 2進形式 |
| COMP-1 | 内部浮動小数点(短精度) |
| COMP-2 | 内部浮動小数点(長精度) |
| COMP-3 | 内部10進形式(パック10進) |
| INDEX | インデックスデータ項目 |
| POINTER | アドレスポインタ |
| POINTER-32 | 32ビットアドレスポインタ |
| PROCEDURE-POINTER | 手続きポインタ |
| FUNCTION-POINTER | 関数ポインタ |
| OBJECT REFERENCE | オブジェクト参照 |
| NATIONAL | ナショナル文字(UTF-16 |
| UTF-8 | UTF-8文字 |
| NATIVE | ネイティブ2進表現 |
### VALUE句
データ項目の初期値を指定。
```
01 WS-COUNT PIC 9(4) VALUE 0.
88 WS-ZERO VALUE 0.
88 WS-POSITIVE VALUE 1 THRU 9999.
```
### その他の句
| 句 | 機能 |
|----|------|
| BLANK WHEN ZERO | 値がゼロのとき項目を空白にする |
| JUSTIFIED RIGHT | 右詰め指定 |
| SYNCHRONIZED | 自然境界への位置合わせ(SYNC) |
| EXTERNAL | 実行単位全体で共有される外部データ |
| GLOBAL | ネストプログラムから参照可能な大域データ |
| SIGN IS LEADING/TRALLING SEPARATE | 符号の表現方法 |
| GROUP-USAGE NATIONAL/UTF-8 | グループ全体の使用法 |
| TYPEDEF / TYPE | ユーザ定義型 |
| DYNAMIC LENGTH | 動的長さ基本項目 |
| VOLATILE | 揮発性データの指定 |
---
# 第5部: PROCEDURE DIVISION詳細
## 5.1 手続き部構造
### PROCEDURE DIVISIONヘッダ
```
PROCEDURE DIVISION USING data-name-1 ...
RETURNING data-name.
```
- USING句: LINKAGE SECTIONの項目を引数として受け取る
- RETURNING句: 戻り値を指定
### 宣言部(DECLARATIVES
例外処理やデバッグ処理を記述する特殊な手続き領域。
```
DECLARATIVES.
section-name SECTION. USE AFTER EXCEPTION/ERROR ON file-name.
...
END DECLARATIVES.
```
### 算術式
算術演算子: `+`(加算), `-`(減算), `*`(乗算), `/`(除算), `**`(べき乗)
演算優先順位: `**``*` / `/``+` / `-`
### 条件式
**関係条件**:
```
operand-1 IS [NOT] GREATER THAN / LESS THAN / EQUAL TO operand-2
operand-1 > / < / = / >= / <= operand-2
```
**クラス条件**:
```
identifier IS [NOT] NUMERIC / ALPHABETIC / ALPHABETIC-LOWER /
ALPHABETIC-UPPER / DBCS / KANJI / class-name
```
**条件名条件**:
```
condition-name 88レベルで定義された条件名)
```
**符号条件**:
```
operand IS [NOT] POSITIVE / NEGATIVE / ZERO
```
**スイッチ状態条件**:
```
condition-name SPECIAL-NAMESで定義されたUPSIスイッチ)
```
**省略引数条件**:
```
data-name IS [NOT] OMITTED
```
**複合条件**:
```
condition-1 AND/OR condition-2
NOT condition
```
---
## 5.2 手続き文一覧
### ACCEPT文
システム日付・時刻・ユーザ入力の受取り。
```
ACCEPT identifier FROM DATE/DAY/TIME/DAY-OF-WEEK/
DATE YYYYMMDD/DAY YYYYDDD
ACCEPT identifier SYSINからの入力)
```
- DATE: PIC 9(6) — YYMMDD
- DATE YYYYMMDD: PIC 9(8) — YYYYMMDD
- DAY: PIC 9(5) — YYDDD
- DAY YYYYDDD: PIC 9(7) — YYYYDDD
- DAY-OF-WEEK: PIC 9(1) — 1=月曜~7=日曜
- TIME: PIC 9(8) — HHMMSShh(時分秒ミリ秒)
### ADD文
加算。ROUNDED、SIZE ERROR、CORRESPONDING句をサポート。
```
ADD identifier/literal TO identifier [ROUNDED]
[ON SIZE ERROR imperative] [NOT ON SIZE ERROR imperative]
ADD identifier/literal GIVING identifier [ROUNDED]
ADD CORRESPONDING identifier-1 TO identifier-2
```
### CALL文
サブプログラム呼出。
```
CALL literal/identifier USING [BY REFERENCE/CONTENT/VALUE] data-name
RETURNING identifier
ON EXCEPTION imperative
NOT ON EXCEPTION imperative
```
- BY REFERENCE: アドレス渡し(デフォルト)
- BY CONTENT: 内容のコピーを渡す
- BY VALUE: 値を渡す
### CANCEL文
プログラムの解放。次回CALL時に初期状態で再ロードされる。
```
CANCEL program-name
```
### CLOSE文
ファイルのクローズ。
```
CLOSE file-name [WITH LOCK/NO REWIND/REEL/FOR REMOVAL]
```
### COMPUTE文
計算代入。複数の算術演算を組合せ可能。
```
COMPUTE identifier [ROUNDED] = arithmetic-expression
[ON SIZE ERROR imperative] [NOT ON SIZE ERROR imperative]
```
### CONTINUE文
無操作(no operation)文。
```
CONTINUE
```
### DELETE文
索引ファイルまたは相対ファイルからのレコード削除。
```
DELETE file-name RECORD
[INVALID KEY imperative] [NOT INVALID KEY imperative]
```
### DISPLAY文
オペランドの内容を出力装置へ転送。
```
DISPLAY identifier/literal
UPON mnemonic-name/environment-name
WITH NO ADVANCING
```
### DIVIDE文
除算。商と余りを計算。
```
DIVIDE identifier INTO identifier [ROUNDED]
[REMAINDER identifier]
DIVIDE identifier BY identifier GIVING identifier [ROUNDED]
[REMAINDER identifier]
```
### EVALUATE文
多分岐。COBOLのswitch/case相当。
```
EVALUATE subject ALSO subject
WHEN object ALSO object imperative
WHEN OTHER imperative
END-EVALUATE
```
### EXIT文
手続きの共通終了点。プログラム/メソッド/PARAGRAPH/SECTIONの終了。
```
EXIT PROGRAM (呼出元に復帰)
EXIT METHOD (メソッド終了)
EXIT PARAGRAPH (段落終了)
EXIT SECTION (節終了)
EXIT PERFORM [CYCLE] (インラインPERFORMからの脱出)
```
### GOBACK文
プログラム/メソッドの論理的終了。呼出元に復帰。
```
GOBACK
```
### GO TO文
制御の移動。
```
GO TO procedure-name (無条件)
GO TO procedure-name DEPENDING ON identifier (条件付)
```
### IF文
条件分岐。
```
IF condition THEN statement-1 ELSE statement-2 END-IF
```
### INITIALIZE文
データ項目のカテゴリ別初期化。
```
INITIALIZE identifier [WITH FILLER] [ALL]
[REPLACING category BY identifier/literal]
[THEN TO DEFAULT]
```
カテゴリ: ALPHABETIC, ALPHANUMERIC, NUMERIC, ALPHANUMERIC-EDITED,
NUMERIC-EDITED, DBCS, NATIONAL, NATIONAL-EDITED, UTF-8等
### INSPECT文
文字列の検査/置換/変換。
```
INSPECT identifier TALLYING count FOR CHARACTERS/ALL/LEADING/FIRST
identifier/literal [BEFORE/AFTER identifier/literal]
INSPECT identifier REPLACING CHARACTERS/ALL/LEADING/FIRST
identifier/literal BY identifier/literal
INSPECT identifier CONVERTING identifier TO identifier
```
### MERGE文
2つ以上のファイルのマージ。
```
MERGE file-name ON ASCENDING/DESCENDING KEY data-name
USING file-name-1 file-name-2
GIVING file-name-3
```
### MOVE文
代入。基本項目移動、グループ移動、編集をサポート。
```
MOVE identifier/literal TO identifier
MOVE CORRESPONDING identifier-1 TO identifier-2
```
### MULTIPLY文
乗算。
```
MULTIPLY identifier BY identifier [ROUNDED]
MULTIPLY identifier BY identifier GIVING identifier [ROUNDED]
```
### OPEN文
ファイルのオープン。
```
OPEN INPUT/OUTPUT/I-O/EXTEND file-name
```
### PERFORM文
繰り返し処理。
```
PERFORM procedure [THRU procedure] (基本)
PERFORM procedure integer TIMES (回数指定)
PERFORM procedure UNTIL condition (条件指定)
PERFORM procedure VARYING identifier FROM ... BY ... UNTIL ...
PERFORM inline-statement END-PERFORM (インライン)
```
### READ文
ファイルからの読込。
```
READ file-name [INTO identifier] [KEY IS data-name]
[AT END imperative] [INVALID KEY imperative]
[NOT AT END/INVALID KEY imperative]
```
### RELEASE文
SORT文へのレコード引き渡し。
```
RELEASE record-name FROM identifier
```
### RETURN文
SORT文からのレコード受取。
```
RETURN file-name INTO identifier
AT END imperative [NOT AT END imperative]
```
### REWRITE文
レコードの書換え。
```
REWRITE record-name [FROM identifier]
[INVALID KEY imperative] [NOT INVALID KEY imperative]
```
### SEARCH文
内部表の探索。
- **シリアルサーチ(SEARCH**: 逐次探索。INDEXED BY必須。
- **バイナリサーチ(SEARCH ALL**: 二分探索。ASCENDING/DESCENDING KEY必須。
```
SEARCH table-name [VARYING index-name]
AT END imperative
WHEN condition imperative
SEARCH ALL table-name
AT END imperative
WHEN KEY condition imperative
```
### SET文
インデックス、アドレス、条件名、ポインタの設定。
```
SET index-name UP BY/DOWN BY integer (索引値の増減)
SET index-name TO integer (索引値設定)
SET condition-name TO TRUE (条件名真設定)
SET address TO pointer (アドレス設定)
SET procedure-pointer TO entry (手続きポインタ設定)
SET object-reference TO object (オブジェクト参照設定)
```
### SORT文
ファイルの整列。
```
SORT file-name ON ASCENDING/DESCENDING KEY data-name
[WITH DUPLICATES IN ORDER]
INPUT PROCEDURE section [THRU section]
USING file-name
OUTPUT PROCEDURE section [THRU section]
GIVING file-name
```
### START文
VSAMファイルの開始位置指定。
```
START file-name KEY IS GREATER THAN/EQUAL TO/LESS THAN data-name
[INVALID KEY imperative] [NOT INVALID KEY imperative]
```
### STOP文
実行停止。
```
STOP RUN (プログラム終了、制御をOSに戻す)
STOP literal (一時停止、オペレータ介入待ち)
```
### STRING文
文字列の連結。
```
STRING identifier/literal DELIMITED BY identifier/literal/SIZE
INTO identifier
[WITH POINTER identifier]
[ON OVERFLOW imperative]
END-STRING
```
### SUBTRACT文
減算。
```
SUBTRACT identifier/literal FROM identifier [ROUNDED]
SUBTRACT identifier/literal FROM identifier GIVING identifier
SUBTRACT CORRESPONDING identifier-1 FROM identifier-2
```
### UNSTRING文
文字列の分解。
```
UNSTRING identifier
DELIMITED BY [ALL] identifier/literal [OR ...]
INTO identifier [DELIMITER IN identifier] [COUNT IN identifier]
[WITH POINTER identifier]
[TALLYING IN identifier]
[ON OVERFLOW imperative] [NOT ON OVERFLOW imperative]
END-UNSTRING
```
### WRITE文
ファイルへの書出し。
```
WRITE record-name [FROM identifier]
[AFTER/BEFORE ADVANCING PAGE/LINE identifier/literal]
[END-OF-PAGE imperative]
[INVALID KEY imperative] [NOT INVALID KEY imperative]
```
---
# 第6部: 組み込み関数
## 関数の呼出し形式
```
FUNCTION function-name ( argument ... )
```
## 関数一覧
| 関数名 | 型 | 説明 |
|--------|-----|------|
| ABS | 数値 | 絶対値 |
| ACOS | 数値 | 逆余弦(アークコサイン) |
| ANNUITY | 数値 | 年金係数 |
| ASIN | 数値 | 逆正弦(アークサイン) |
| ATAN | 数値 | 逆正接(アークタンジェント) |
| BIT-OF | 整数 | 2進数文字列表現 |
| BIT-TO-CHAR | 英数字 | 2進文字列を文字に変換 |
| BYTE-LENGTH | 整数 | バイト長 |
| CHAR | 英数字 | コードポイントから文字 |
| COMBINED-DATETIME | 整数 | 日時を結合した整数値 |
| CONTENT-OF | 英数字/ナショナル | ファイル内容の読取り |
| COS | 数値 | 余弦(コサイン) |
| CURRENT-DATE | 英数字 | 現在日時(YYYYMMDDhhmmssss+hhmm |
| DATE-OF-INTEGER | 整数 | 整数日付→YYYYMMDD変換 |
| DATE-TO-YYYYMMDD | 整数 | 2桁年→4桁年変換 |
| DAY-OF-INTEGER | 整数 | 整数日付→YYYYDDD変換 |
| DAY-TO-YYYYDDD | 整数 | 2桁年→4桁年(ユリウス日)変換 |
| DISPLAY-OF | 英数字 | ナショナル/UTF-8→指定コードページ変換 |
| E | 数値 | 自然対数の底(約2.71828) |
| EXP | 数値 | eのべき乗 |
| EXP10 | 数値 | 10のべき乗 |
| FACTORIAL | 整数 | 階乗 |
| FORMATTED-CURRENT-DATE | 英数字/ナショナル/UTF-8 | 書式指定現在日時 |
| FORMATTED-DATE | 英数字/ナショナル/UTF-8 | 書式指定日付変換 |
| FORMATTED-DATETIME | 英数字/ナショナル/UTF-8 | 書式指定日時変換 |
| FORMATTED-TIME | 英数字/ナショナル/UTF-8 | 書式指定時刻変換 |
| HEX-OF | 英数字 | 16進文字列表現 |
| HEX-TO-CHAR | 英数字 | 16進文字列→バイト変換 |
| INTEGER | 整数 | 切捨て整数化 |
| INTEGER-OF-DATE | 整数 | YYYYMMDD→整数日付変換 |
| INTEGER-OF-DAY | 整数 | YYYYDDD→整数日付変換 |
| INTEGER-OF-FORMATTED-DATE | 整数 | 書式指定日付→整数日付変換 |
| INTEGER-PART | 整数 | 整数部 |
| LENGTH | 整数 | 文字位置長(キャラクタ長) |
| LOG | 数値 | 自然対数 |
| LOG10 | 数値 | 常用対数 |
| LOWER-CASE | 英数字 | 英字小文字変換 |
| MAX | 可変 | 最大値 |
| MEAN | 数値 | 平均値 |
| MEDIAN | 数値 | 中央値 |
| MIDRANGE | 数値 | ミッドレンジ |
| MIN | 可変 | 最小値 |
| MOD | 整数 | 剰余(モジュロ) |
| NATIONAL-OF | ナショナル | 英数字→ナショナル変換 |
| NUMVAL | 数値 | 英数字→数値変換 |
| NUMVAL-C | 数値 | 通貨記号付き文字列→数値変換 |
| NUMVAL-F | 数値 | 浮動小数点文字列→数値変換 |
| ORD | 整数 | 文字の序数位置 |
| ORD-MAX | 整数 | 最大値の引数の序数 |
| ORD-MIN | 整数 | 最小値の引数の序数 |
| PI | 数値 | 円周率(約3.14159 |
| PRESENT-VALUE | 数値 | 現在価値 |
| RANDOM | 数値 | 乱数 |
| RANGE | 数値 | 範囲(最大値-最小値) |
| REM | 数値 | 剰余(REM = 被除数 - 除数 * 商) |
| REVERSE | 英数字/ナショナル | 文字列反転 |
| SECONDS-FROM-FORMATTED-TIME | 数値 | 書式指定時刻→秒数 |
| SECONDS-PAST-MIDNIGHT | 数値 | 現在時刻の正午からの経過秒数 |
| SIGN | 整数 | 符号(-1, 0, 1 |
| SIN | 数値 | 正弦(サイン) |
| SQRT | 数値 | 平方根 |
| STANDARD-DEVIATION | 数値 | 標準偏差 |
| SUM | 数値 | 合計 |
| TAN | 数値 | 正接(タンジェント) |
| TEST-DATE-YYYYMMDD | 整数 | YYYYMMDD日付の妥当性検証 |
| TEST-DAY-YYYYDDD | 整数 | YYYYDDD日付の妥当性検証 |
| TEST-FORMATTED-DATETIME | 整数 | 書式指定日時の妥当性検証 |
| TEST-NUMVAL | 整数 | 数値変換可能性の検証 |
| TEST-NUMVAL-C | 整数 | 通貨数値変換可能性の検証 |
| TEST-NUMVAL-F | 整数 | 浮動小数点変換可能性の検証 |
| TRIM | 英数字/ナショナル | 先頭/末尾スペース除去 |
| ULENGTH | 整数 | ナショナル文字の長さ(コードポイント単位) |
| UPOS | 整数 | ナショナル文字列内の部分文字位置 |
| UPPER-CASE | 英数字/ナショナル | 英字大文字変換 |
| USUBSTR | ナショナル | ナショナル部分文字列 |
| USUPPLEMENTARY | 整数 | 補助文字サロゲート有無判定 |
| UUID4 | 英数字 | UUID v4生成 |
| UVALID | 整数 | UTF-16文字列の妥当性検証 |
| UWIDTH | 整数 | UTF-16符号化単位数 |
| VARIANCE | 数値 | 分散 |
| WHEN-COMPILED | 英数字 | コンパイル日時(YYYYMMDDhhmmsshh+00 |
| YEAR-TO-YYYY | 整数 | 2桁年→4桁年変換 |
---
# 第7部: コンパイラ指示文とコンパイラ指令
## コンパイラ指示文(Compiler-Directing Statements
### BASIS文
別のソーステキストを現在のソースユニットに組み込む。
```
BASIS "basis-name"
```
### CBLPROCESS)文
コンパイラオプションをソース内で指定。
```
CBL option-name
PROCESS option-name
```
### *CBL*CONTROL)文
ソースコード一覧の制御。
```
*CBL SOURCE/NOSOURCE MAP/NOMAP LIST/NOLIST
```
### COPY文
COPYライブラリからソーステキストを組み込む。テキスト操作(置換)可能。
```
COPY text-name [IN library-name]
[REPLACING ==pseudo-text== BY ==pseudo-text== ...]
```
- 疑似テキストによる置換機能
- ライブラリ検索順序: 指定ライブラリ → SYSLIB
### DELETE文
ソース一覧からの行削除指示(コーディングシート用)。
```
DELETE line-number
```
### EJECT文
ソース一覧の改ページ。
```
EJECT
```
### ENTER文
他言語(COBOL以外)のプログラムの呼出し(非推奨)。
```
ENTER language-name routine-name
```
### INSERT文
ソース一覧への行挿入。
```
INSERT line-number
```
### READY/RESET TRACE文
トレースの開始・停止。
```
READY TRACE
RESET TRACE
```
### REPLACE文
ソーステキストの置換を指定。
```
REPLACE ==pseudo-text== BY ==pseudo-text== ...
REPLACE OFF
```
### SERVICE LABEL文
サービストレースのラベル設定。
```
SERVICE LABEL label-name
```
### SERVICE RELOAD文
サービスの再ロード。
```
SERVICE RELOAD
```
### SKIP文
ソース一覧での行送り。
```
SKIP1 / SKIP2 / SKIP3
```
### TITLE文
ソース一覧のタイトル指定。
```
TITLE "title-text"
```
### USE文
例外処理・デバッグ宣言。
```
USE AFTER EXCEPTION/ERROR ON file-name/INPUT/OUTPUT/I-O/EXTEND
USE FOR DEBUGGING ON procedure-name
```
---
## コンパイラ指令(Compiler Directives
コンパイラ指令は `>>` で始まり、Area Bに記述する。
### CALLINTERFACE
Javaとの相互運用のための呼出しインターフェース指定。
```
>>CALLINTERFACE DLL
```
### DATA
WORKING-STORAGEの割当て場所指定。
```
>>DATA 24 / 31
```
### 条件付きコンパイル(Conditional Compilation
`>>DEFINE`, `>>EVALUATE`, `>>IF` 等で条件付きコンパイルを実現。
```
>>DEFINE variable = value
>>IF condition
...source text...
>>ELSE
...source text...
>>END-IF
```
**事前定義コンパイル変数**:
- COBOL, COBOL2002, ENTERPRISE_COBOL, IBM_ARCHITECTURE,
OS_FLAVOR, LOCALE, LANGUAGE 等
### JAVA-CALLABLE
Javaから呼出し可能なCOBOLプログラムの指定。
```
>>JAVA-CALLABLE program-name
```
### JAVA-SHAREABLE
COBOLプログラムがJavaと共有可能なデータを持つことを指定。
```
>>JAVA-SHAREABLE
```
---
## IBM拡張機能(主要なもの)
Enterprise COBOL for z/OS V6.5は多くのIBM拡張機能を提供する:
- 特殊レジスタ: ADDRESS OF, LENGTH OF, RETURN-CODE, JSON-CODE, XML-CODE等
- 16進リテラル表記: X"...", NX"...", UX"..."
- NULL終端リテラル: Z"..."
- 日本語処理のためのDBCSサポート: Gリテラル、USAGE DISPLAY-1、PICTURE G/N
- 条件付きコンパイル: >>DEFINE, >>IF, >>EVALUATE
- CALL文のJava静的メソッド呼出し
- JSON GENERATE/PARSE文
- XML GENERATE/PARSE文
- ALLOCATE/FREE文による動的記憶管理
- 動的長さ基本項目(DYNAMIC LENGTH
- 無制限表(OCCURS UNBOUNDED
- 全関数のALL下标指定
- 64ビットアドレッシング(LP(64))
---
## ファイルステータスキー値
| コード | 意味 |
|--------|------|
| 00 | 正常終了 |
| 02 | 正常終了(重複レコード) |
| 04 | 正常終了(レコード長不整合) |
| 05 | 正常終了(参照オプショナルファイル未存在) |
| 10 | ファイル終了 |
| 14 | 相対ファイルの範囲外レコード |
| 21 | シーケンスエラー |
| 22 | 重複キー |
| 23 | レコード未存在 |
| 24 | バッファ不足 |
| 30 | 恒久的エラー |
| 34 | ファイル編成の境界違反 |
| 35 | ファイル未存在(OPEN |
| 37 | アクセスモード違反 |
| 38 | クローズ前のOPEN |
| 39 | 属性矛盾 |
| 41 | OPEN時のファイル未存在 |
| 42 | クローズ済ファイルのOPEN |
| 43 | 書込み禁止ファイルの書込み |
| 44 | 読込み専用ファイルの書換え/削除 |
| 46 | 読込み専用(順次) |
| 47 | OPEN時のファイル読込み不可 |
| 48 | ファイル編成とアクセスモード矛盾 |
| 49 | OPEN時のファイル属性不整合 |
| 90 | 論理エラー該当せず |
| 91 | ファイル機構のアベンド |
| 92 | ストレージ不足 |
| 93 | リソースアクセス不可 |
| 94 | ファイルの位置指定不整合 |
| 95 | ファイル宣言の不整合 |
| 96 | 入出力制御の矛盾 |
| 97 | ファイルの編成/モード矛盾 |
| 98 | ボリューム処理エラー |
| 99 | レコードロック競合 |
---
*本ドキュメントは IBM Enterprise COBOL for z/OS V6.5 Language Reference (SC27-8713-04) の内容に基づいて作成されました。*