← 学習トップに戻る 🏠 hideの部屋

🖥️ COBOL

Common Business-Oriented Language(1959年生まれ)。金融・保険・官公庁など基幹業務システムで現在も広く使われるレガシー言語。

📌 プログラム4大分割

DIVISION役割
IDENTIFICATION DIVISIONプログラム名・作成者などのメタ情報
ENVIRONMENT DIVISION外部ファイルとの割り当て(SELECT文)
DATA DIVISION変数・ファイルレコードの定義(PIC句)
PROCEDURE DIVISION処理ロジック(動詞を使って記述)

📌 データ定義(PIC句)

PIC句意味例
PIC 9(5)数字5桁12345
PIC X(10)英数字10桁HELLO     
PIC S9(7)V99符号付き数字7桁+小数2桁-1234567.89
PIC 9(5) COMP-3パック10進数(内部形式)高速演算用
PIC 9(5) COMPバイナリ数値2バイト/4バイト

📌 主要動詞

COBOLの動詞(命令)は機能別に以下のカテゴリに分類される。

📋 データ操作・転送

動詞用途・備考
MOVE A TO B変数AをBへコピー。型が違っても自動変換(桁あふれに注意)
MOVE CORRESPONDING A TO B同名のフィールドを一括コピー(グループ項目間)
INITIALIZE WS-REC数字項目→0、文字項目→スペースで初期化
SET IDX TO 1添字・インデックス値をセット
SET FLAG-ON TO TRUE条件名(88レベル)の値をセット

🔢 算術演算

動詞用途・備考
ADD A TO BB = B + A
ADD A B GIVING CC = A + B(Bを変更しない)
SUBTRACT A FROM BB = B − A
SUBTRACT A FROM B GIVING CC = B − A
MULTIPLY A BY BB = B × A
MULTIPLY A BY B GIVING CC = A × B
DIVIDE A INTO BB = B ÷ A
DIVIDE A BY B GIVING C REMAINDER D商と余りを同時取得
COMPUTE C = A + B * (D - E)数式で記述。演算子:+ − * / **(べき乗)
ON SIZE ERROR …桁あふれ発生時の例外処理(算術動詞と組み合わせ)

⚙️ 手続き・制御

動詞用途・備考
PERFORM PARA-NAME段落を1回呼び出す
PERFORM PARA-NAME THRU PARA-ENDPARA-NAMEからPARA-ENDまでの段落群を実行
PERFORM PARA-NAME N TIMESN回繰り返す
PERFORM VARYING i FROM 1 BY 1 UNTIL i > 10カウンタ制御ループ。UNTIL条件が真になると終了
PERFORM UNTIL EOF = 'Y'条件制御ループ(while相当)
IF cond … ELSE … END-IF条件分岐。ネスト可。END-IFを忘れずに
EVALUATE TRUE / WHEN cond多分岐(switch相当)。WHEN OTHER で default
GO TO PARA-NAME無条件ジャンプ。現代COBOLでは極力使わない
CALL 'SUBPROG' USING WS-VAR外部サブプログラム呼び出し。BY REFERENCE / BY VALUE 指定可
EXIT PROGRAMサブプログラムから呼び出し元へ戻る
STOP RUNプログラム終了(メインプログラム用)
CONTINUE何もしない(IF/ELSE の空ブランチに使う)

📂 ファイル・入出力

動詞用途・備考
OPEN INPUT file読み込み用オープン
OPEN OUTPUT file書き込み用(上書き)オープン
OPEN I-O file読み書き両用オープン(索引ファイルで多用)
OPEN EXTEND file追記オープン
READ file AT END …1レコード読み込み。EOF時にAT END句実行
READ file KEY = field INVALID KEY …索引ファイルのキー検索。未発見時にINVALID KEY句
WRITE recordレコード書き込み(OUTPUT/EXTEND時)
REWRITE record現在レコードを上書き更新(I-O時)
DELETE file RECORD現在レコードを削除(索引ファイル)
START file KEY >= field索引ファイルの読み取り開始位置を設定
CLOSE fileファイルクローズ(必ず実行)
DISPLAY 'text' variableコンソール出力
ACCEPT variable FROM DATEシステム日付(YYYYMMDD)取得。TIME / DAY-OF-WEEK も可

🔤 文字列操作

動詞用途・備考
STRING s1 s2 DELIMITED BY SIZE INTO res複数文字列を連結してresへ格納
UNSTRING src DELIMITED BY ',' INTO f1 f2デリミタで分割して各変数へ格納
INSPECT str TALLYING cnt FOR ALL 'X'文字列中の文字数をカウント
INSPECT str REPLACING ALL 'A' BY 'B'文字列置換

💡 プログラム構造サンプル

       IDENTIFICATION DIVISION.
       PROGRAM-ID. HELLO-WORLD.

       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01  WS-NAME      PIC X(20) VALUE 'COBOL'.
       01  WS-COUNTER   PIC 9(3)  VALUE 0.

       PROCEDURE DIVISION.
       MAIN-PARA.
           PERFORM VARYING WS-COUNTER
               FROM 1 BY 1
               UNTIL WS-COUNTER > 5
               DISPLAY 'Count: ' WS-COUNTER
           END-PERFORM.
           STOP RUN.

💡 ファイル処理

       ENVIRONMENT DIVISION.
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.
           SELECT IN-FILE ASSIGN TO 'INPUT.DAT'
               ORGANIZATION IS SEQUENTIAL.

       DATA DIVISION.
       FILE SECTION.
       FD  IN-FILE.
       01  IN-REC.
           05  IN-CODE   PIC X(5).
           05  IN-NAME   PIC X(20).

       PROCEDURE DIVISION.
           OPEN INPUT  IN-FILE.
           READ IN-FILE AT END MOVE 'Y' TO EOF-FLG.
           CLOSE IN-FILE.

🔗 参考リンク