なぜ「COPY文」が重要なのか?
COBOL開発の世界では、何万行という巨大なプログラムを扱うことが珍しくありません。もし、同じレコード定義や共通の定数を複数のプログラムにバラバラに記述していたらどうなるでしょう? 一箇所修正するたびに、すべてのプログラムを探し回って書き換える必要が出てきます。これはバグの温床です。
そこで登場するのが「COPY文」です。外部のライブラリ(コピー句)をプログラムのコンパイル時に自動的に展開するこの仕組みは、コードの共通化と保守性向上のために不可欠なツールです。
COPY文の基礎知識
COPY文とは、あらかじめ作成しておいたCOBOLのコード片(コピー句)を、プログラムの任意の場所に「差し込む」命令です。
1. ライブラリ(コピー句): プログラムの一部を切り出したファイルです。拡張子には「.cpy」などが使われます。
2. コンパイル時の展開: 実行時ではなく、コンパイル時に読み込まれるため、実行速度への影響はありません。
3. REPLACING句: コピー句の中身をそのまま使うのではなく、一部の文字列を置換して取り込むための強力なオプションです。
実装と解決策:REPLACING句の活用
ただ取り込むだけでは柔軟性に欠けることがありますが、REPLACING句を使えば一つの定義を「型」として再利用できます。例えば、顧客データ定義(CUSTOMER-REC)を、部署ごとに異なる変数名で使い回したい場合に非常に有効です。
サンプルプログラム
以下は、COPY文を使って外部からデータ定義を読み込み、REPLACING句で変数名をカスタマイズする例です。
[外部ライブラリ:CUSTOMER.CPY]
01 CUSTOMER-REC.
05 NAME PIC X(20).
05 AGE PIC 9(03).
[メインプログラム]
IDENTIFICATION DIVISION.
PROGRAM-ID. COPY-SAMPLE.
WORKING-STORAGE SECTION.
- 顧客定義を読み込み、NAMEをC-NAMEという変数名に置き換えて取り込む
COPY CUSTOMER REPLACING ==NAME== BY ==C-NAME==.
PROCEDURE DIVISION.
- 置き換わった変数名C-NAMEを使用して値を代入
MOVE “田中太郎” TO C-NAME.
MOVE 30 TO AGE.
DISPLAY “氏名: ” C-NAME.
DISPLAY “年齢: ” AGE.
STOP RUN.
応用・注意点:現場で陥りやすい罠
COPY文を使う際に、ベテランとして一つだけ注意してほしいことがあります。それは「コピー句のネスト(入れ子)」です。
COPY句の中でさらに別のCOPY句を呼び出すことは可能ですが、深くしすぎると、どこで何が定義されているのか追跡が困難になります。また、循環参照(AがBを呼び出し、BがAを呼び出す)が発生するとコンパイルエラーとなります。
現場では、「データ定義専用」「定数定義専用」と役割を明確に分けるのがベストプラクティスです。修正が必要になった際、一箇所直せばすべてに反映される快感を、ぜひ皆さんも体験してください。この積み重ねが、堅牢なCOBOLシステムを支える土台となるのです。

コメント