# 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-1140(CCSID 1140) - ナショナルリテラルおよびUSAGE NATIONALのデータは UTF-16BE(CCSID 1200)で符号化 - UTF-8リテラルおよびUSAGE UTF-8のデータは UTF-8(CCSID 1208)で符号化 **文字符号化単位(エンコーディングユニット)**: | USAGE / カテゴリ | エンコーディング単位 | |-----------------|---------------------| | DISPLAY(英数字) | 1バイト | | DISPLAY-1(DBCS) | 2バイト | | NATIONAL | 2バイト | | UTF-8 | 1バイト | **ランタイムコードページの種類**: - シングルバイトEBCDIC - EBCDIC DBCS(Shift-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バイト。以下の文字を使用可能: - ラテン大文字 A~Z - ラテン小文字 a~z - 数字 0~9 - ハイフン(-):先頭・末尾不可 - アンダースコア(_):先頭不可 **ユーザ定義語の種類と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-name(XMLスキーマ名) | 可 | ### システム名 システムに対して特定の意味を持つ文字列。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""` または `G''` - 最大長: 28文字 - 継続不可 **UTF-8リテラル**: - 基本形式: `U"文字データ"` または `U'文字データ'` - Unicodeエスケープシーケンス対応: `\uhhhh` (BMP), `\U00hhhhh` (追加面) - 16進表記: `UX"hex"` または `UX'hex'` **数値リテラル**: - 数字0-9、符号(+/-)、小数点で構成 - 整数: 1~18桁(ARITH(COMPAT)時)または1~31桁(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 | 1~6 | 行番号(任意) | | Indicator area | 7 | 指示子 | | Area A | 8~11 | 特定の要素の開始位置 | | Area B | 12~72 | エントリ、文、句など | **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、N(NSYMBOL(DBCS)時) | | External floating-point | +9.9E+99形式 | | National | N(NSYMBOL(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" ``` ### CBL(PROCESS)文 コンパイラオプションをソース内で指定。 ``` 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) の内容に基づいて作成されました。*