導入:なぜ「USING句」が重要なのか
COBOL開発の現場では、一つの大きなプログラムですべてを処理するのではなく、機能ごとに細かく分けたプログラムを呼び出して実行することが一般的です。このとき、メインのプログラムからサブのプログラムへ「データを渡す」必要があります。この橋渡し役を担うのが「USING句」です。ここを正しく理解していないと、データの不整合が起きたり、最悪の場合はシステムが異常終了したりします。今日は、この重要なインターフェースの仕組みを一緒に学びましょう。
基礎知識:Linkage SectionとUSING句の役割
プログラム間でデータをやり取りするには、二つの準備が必要です。
1. Linkage Section(リンケージ・セクション):呼び出し先プログラムの中で、外部から受け取るデータを受け止めるための「器(変数)」を定義する場所です。
2. PROCEDURE DIVISION USING:プログラムの開始位置で、どの器を使ってデータを受け取るかを宣言する場所です。
注意すべき点は、「順番」と「データ型・サイズ」の完全一致です。呼び出し元が「A、B」の順で送るなら、呼び出し先も必ず「A、B」の順で受け取らなければなりません。この順番がずれると、データが化ける(意図しない値が入る)原因になります。
実装・解決策
プログラムを設計する際は、まず「何を受け取るか」を決め、それをLinkage Sectionに書きます。次に、PROCEDURE DIVISIONのヘッダーでその変数名を並べます。これにより、呼び出し元からのデータが自動的にメモリ上の該当する変数へマッピングされます。
サンプルプログラム
以下は、2つの数値を受け取り、その合計を計算して戻すサブプログラムの例です。
IDENTIFICATION DIVISION.
PROGRAM-ID. SUB-CALC.
DATA DIVISION.
- 外部から受け取るデータはここへ定義します
LINKAGE SECTION.
01 PARAM-VAL1 PIC 9(04).
01 PARAM-VAL2 PIC 9(04).
01 RESULT-VAL PIC 9(05).
- 受け取る変数を指定します(順番が重要!)
PROCEDURE DIVISION USING PARAM-VAL1, PARAM-VAL2, RESULT-VAL.
- 受け取った値を使って計算処理
COMPUTE RESULT-VAL = PARAM-VAL1 + PARAM-VAL2.
- 処理を終了して呼び出し元へ戻る
GOBACK.
応用・注意点:現場で陥りやすい罠
最後に、ベテランとして現場でよく見る注意点を2つお伝えします。
1. サイズの不一致:呼び出し元で「PIC X(10)」として送ったものを、受け取り側で「PIC X(5)」と定義すると、データが切り捨てられたり、メモリ破壊につながったりします。コピーブックを使用して、定義を共通化するのが鉄則です。
2. ポインタ(アドレス)の概念:COBOLのUSING句は、基本的に「アドレス(場所)」を渡しています。そのため、サブプログラム内で値を書き換えると、呼び出し元の値も変わります。これが意図した挙動か、常に意識してください。
まずはシンプルな数値の受け渡しから始めて、ぜひ「呼び出し元」と「呼び出し先」のセットで動作を確認してみてください。この基本をマスターすれば、大規模なシステム開発も怖くありませんよ!

コメント