1. 導入:なぜデータ連結で「あふれ」をケアする必要があるのか?
COBOLの現場では、複数の項目を繋ぎ合わせて一つの長い文字列を作る処理が頻繁に行われます。しかし、連結先の項目の桁数が足りなくなった場合、何も対策をしていないと、データは無慈悲に切り捨てられ、システム上の予期せぬ不整合を引き起こします。今回紹介する「ON OVERFLOW」句は、そんな「容量オーバー」を自動検知し、安全なエラー処理へ誘導するための非常に重要な制御フローです。
2. 基礎知識:STRING文とオーバーフローの仕組み
STRING文は、複数の項目を連結して一つの受け取り側項目に格納する命令です。ここで重要なのが「受け取り側項目の長さ」です。もし、連結したいデータの合計が受け取り側項目の長さを超えた場合、COBOLは「あふれた(OVERFLOW)」と判断します。この時、あふれた分は無視され、処理が継続されてしまうのがデフォルトの挙動です。これを防ぐために、ON OVERFLOW句を使い、あふれた瞬間に特定の処理(エラーログ出力や異常終了処理)へ制御を移すのがプロの作法です。
3. 実装・解決策:構造化制御による堅牢な実装
ON OVERFLOW句を記述することで、データ欠落が発生した際に、どの処理を実行すべきかを明確に定義できます。これにより、「データが足りないまま進んでしまう」というバグを未然に防ぎ、システム全体の堅牢性を高めることが可能です。
4. サンプルプログラム
以下のコードは、氏名の連結時に容量が不足した場合、エラーメッセージを出力して処理を分岐させる例です。
IDENTIFICATION DIVISION.
PROGRAM-ID. STRING-SAMPLE.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 LAST-NAME PIC X(5) VALUE "TANAKA".
01 FIRST-NAME PIC X(5) VALUE "TARO".
01 FULL-NAME PIC X(7) VALUE SPACES. > あえて短く設定し、オーバーフローを起こす
PROCEDURE DIVISION.
> 連結処理:スペースを挟んで連結
STRING LAST-NAME DELIMITED BY SPACE
" " DELIMITED BY SIZE
FIRST-NAME DELIMITED BY SPACE
INTO FULL-NAME
ON OVERFLOW
PERFORM ERR-ROUTINE
NOT ON OVERFLOW
DISPLAY "連結成功: " FULL-NAME
END-STRING.
STOP RUN.
ERR-ROUTINE.
> ここにデータ欠落時の例外処理を記述する
DISPLAY "エラー: 連結先項目が不足しています。データが切り捨てられました。"
.
5. 応用・注意点:現場で役立つポイント
実務でこの句を使う際、以下の点に注意してください。
1. データ切り捨てのタイミング
ON OVERFLOWが実行されると、その時点でSTRING文の実行は中断されます。つまり、連結しようとしていたデータが途中で止まることを意味します。
2. 桁数設計の再考
もし頻繁にOVERFLOWが発生するようであれば、それはプログラムの不具合というより「データの設計ミス」である可能性が高いです。エラー処理を入れることは前提としつつ、受け取り側のPIC句の長さが業務要件を満たしているか、今一度見直す癖をつけましょう。
3. END-STRINGの徹底
最近のCOBOL(COBOL85以降)では、明示的にEND-STRINGで範囲を区切るのが標準です。これにより、IF文などの他の制御構文と組み合わせた際も、論理構造が崩れにくくなります。
プログラムは「正常に動くこと」だけでなく、「異常が起きた時にどう振る舞うか」でその価値が決まります。ぜひ、このOVERFLOW句を使いこなして、堅牢なプログラム作成を目指してください!

コメント