1. 導入:なぜRETURNING句が重要なのか
COBOLのバッチ処理において、ジョブ制御(JCLやシェルスクリプト)との連携は不可欠です。処理が正常に完了したのか、あるいは異常終了したのかを呼び出し元に正確に伝えることは、堅牢なシステムを構築するための第一歩です。従来は特殊レジスタ「RETURN-CODE」への代入が一般的でしたが、現代のCOBOL開発においては、PROCEDURE DIVISIONのRETURNING句を活用することで、プログラムのインターフェースをより明確かつ構造的に定義できるようになります。
2. 基礎知識:RETURNING句の役割
RETURNING句は、プログラムが終了する際に呼び出し元へ戻り値を返却するための仕組みです。これを用いると、プログラムの「出口」がどこであるかが明確になり、戻り値の型やサイズもデータ定義と整合性を保ちやすくなります。
一般的に、戻り値「0」は正常終了、それ以外の値はエラー種別を示すために使用します。呼び出し側(OSやシェル、親プログラム)は、この値を評価することで後続処理を継続するか、エラーログを出力して停止するかを判断します。
3. 実装/解決策:戻り値の設計と実装
RETURNING句を使用する場合、PROCEDURE DIVISIONのヘッダーに記述し、EXIT PROGRAM文(またはGOBACK文)で値を指定します。
注意すべき点は、戻り値として受け取る変数は、呼び出し側と型を一致させる必要があることです。基本的には「PIC S9(9) COMP」などの符号付き整数型を使用するのが定石です。
4. サンプルプログラム
以下は、ファイル読み込みの成否を戻り値として返すサンプルの副プログラムです。
IDENTIFICATION DIVISION.
PROGRAM-ID. CHECK-FILE.
DATA DIVISION.
WORKING-STORAGE SECTION.
- 戻り値を定義
01 WS-RETURN-VAL PIC S9(9) COMP VALUE 0.
PROCEDURE DIVISION RETURNING WS-RETURN-VAL.
- ここで何らかの処理を行う
- 仮にエラーが発生したと想定
MOVE 8 TO WS-RETURN-VAL.
- 呼び出し元へ戻る
GOBACK.
- 呼び出し側のイメージ(呼び出し側プログラムの一部)
- CALL “CHECK-FILE” RETURNING RETURN-STATUS.
- IF RETURN-STATUS NOT = 0 THEN
- DISPLAY “エラーが発生しました: ” RETURN-STATUS
- END-IF.
5. 応用・注意点:現場で陥りやすい罠
戻り値の重複定義に注意
RETURNING句を使用しているにもかかわらず、プログラム内で「MOVE 0 TO RETURN-CODE」を混在させてしまうと、どちらの値が優先されるか混乱を招きます。コーディング規約で「戻り値はRETURNING句に一本化する」といったルールを設けることを推奨します。
呼び出し側の型合わせ
呼び出し側で受け取る変数の定義(PIC句)が、副プログラムのRETURNING句と異なると、予期せぬ値(ゴミデータ)が返ってくることがあります。特に、COMP(バイナリ)形式なのか、DISPLAY(ゾーン)形式なのか、バイト境界やサイズを厳密に合わせることが、デバッグ時間を削減する鍵となります。
現場の運用では、戻り値のパターン(0:正常, 4:警告, 8:異常など)をチーム内で共通定義としてドキュメント化しておくことが、保守性を高める最良の手段です。

コメント