1. 導入:なぜSTRING文で「あふれ」を検知するのか
帳票出力やデータ連携の現場において、可変長の文字列を連結する処理は頻繁に行われます。しかし、連結後の文字列が受取り側のデータ領域(ホスト変数やレコード項目)をはみ出してしまった場合、COBOLは黙って切り捨てを行うことがあり、これがデータ欠損という深刻なバグを引き起こす原因となります。この課題を解決し、堅牢なプログラムを書くために欠かせないのが「ON OVERFLOW」句による明示的な制御です。
2. 基礎知識:STRING文とバッファ管理
STRING文は、複数の項目を1つの項目に連結する際に使用します。ここで重要なのは、連結先の項目長が不足した場合の挙動です。デフォルトでは連結処理がそこで強制終了されますが、プログラム側で何も制御していないと、何が起きたか(データが途切れたか)をシステムが認識できません。
ON OVERFLOWを指定することで、連結先が足りなくなった瞬間に制御を別処理へ移すことが可能になります。これは、データの整合性を最優先する金融系や基幹システムの開発において、非常に重要な「安全装置」となります。
3. 実装/解決策:データ欠損を許さない設計
実装のポイントは、OVERFLOWが発生した際に「ログ出力」や「エラーフラグのセット」を行い、後続処理を安全に停止させることです。単に切り捨てるのではなく、異常系としてハンドリングすることで、後のデバッグが劇的に楽になります。また、POINTER句を併用することで、現在どの位置まで連結できたかを追跡し、より詳細なエラー解析を行うことも可能です。
4. サンプルプログラム
以下のサンプルは、連結先のサイズが不足した場合にエラーメッセージを表示し、処理を安全に中断する構成です。
IDENTIFICATION DIVISION.
PROGRAM-ID. STRING-SAMPLE.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-STR-1 PIC X(05) VALUE "ABCDE".
01 WS-STR-2 PIC X(05) VALUE "FGHIJ".
01 WS-RESULT PIC X(07). > 連結先が7バイトしかないのでOVERFLOWする
PROCEDURE DIVISION.
> 文字列連結処理
STRING WS-STR-1 DELIMITED BY SIZE
WS-STR-2 DELIMITED BY SIZE
INTO WS-RESULT
ON OVERFLOW
PERFORM ERR-PROC
NOT ON OVERFLOW
DISPLAY "連結成功: " WS-RESULT
END-STRING.
STOP RUN.
ERR-PROC.
> エラーハンドリング処理
DISPLAY "エラー: 受取り側のサイズが不足しています。"
DISPLAY "連結処理を中断しました。"
.
5. 応用・注意点:現場で陥りやすい罠
現場でよくある失敗は、「NOT ON OVERFLOW」句の書き忘れです。OVERFLOWが発生しなかった場合にも、正常系の処理を記述しておくことで、条件分岐の意図が明確になります。
また、日本語(漢字)が含まれる場合は特に注意が必要です。Shift-JISなどのマルチバイト文字を扱う際、文字数とバイト数の認識違いからOVERFLOWが発生しやすくなります。受取り側の領域定義は、必ず「最悪のケース(最大バイト数)」を想定して余裕を持たせるか、あらかじめOVERFLOW判定を前提とした動的な領域管理を検討してください。堅牢なシステムは、こうした細かい「あふれ」への配慮から生まれます。

コメント