COBOLのCALL文の基本構文とパラメータ渡しを完全ガイド!初心者向けにやさしく解説
生徒
「先生、COBOLで他のプログラムを呼び出す方法ってあるんですか?」
先生
「はい、COBOLではCALL文を使って、別のプログラムや処理を呼び出すことができますよ。」
生徒
「なんだか電話をかけるみたいな名前ですね。どうやって使うんですか?」
先生
「良いイメージです。CALLはまさに“電話をかけて用事をお願いする”ようなものです。では、わかりやすく説明していきましょう!」
1. CALL文とは?
CALL文は、COBOLプログラムの中で別のプログラム(サブルーチン)を呼び出す命令です。「メインのプログラム」から「補助的な処理」を別のプログラムに依頼するときに使います。
パソコンにあまり慣れていない人でも、「宅配を頼む」ときのイメージを持つと分かりやすいです。メインのプログラムは「お客さん」で、サブルーチンが「宅配業者」。お客さん(メイン)が電話(CALL)で「これをお願いします」と頼むと、宅配業者(サブルーチン)が処理をしてくれる、という流れです。
2. CALL文の基本構文
COBOLでのCALL文の基本的な書き方は以下の通りです。
CALL 'サブルーチンプログラム名' USING 引数1 引数2 ...
ここでのポイントは次の通りです:
- 'サブルーチンプログラム名':呼び出したいプログラムの名前(文字列)です。
- USING:あとに続く変数を、呼び出したプログラムに渡します。これをパラメータ渡し(引数の受け渡し)と呼びます。
3. CALL文とパラメータ渡しの具体例
ここで、CALL文とUSINGによるパラメータ渡しの仕組みを、具体的な例で見てみましょう。
メインプログラム:
IDENTIFICATION DIVISION.
PROGRAM-ID. MAINPROG.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 USER-NAME PIC A(20).
PROCEDURE DIVISION.
DISPLAY "あなたの名前を入力してください:"
ACCEPT USER-NAME
CALL 'HELLO-PROG' USING USER-NAME
STOP RUN.
呼び出されるサブルーチン:
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO-PROG.
DATA DIVISION.
LINKAGE SECTION.
01 RECEIVED-NAME PIC A(20).
PROCEDURE DIVISION USING RECEIVED-NAME.
DISPLAY "こんにちは、" RECEIVED-NAME "さん!"
EXIT PROGRAM.
実行結果の例:
あなたの名前を入力してください:
やまだ
こんにちは、やまださん!
このように、メインのプログラムからユーザーの名前を受け取って、その名前をCALLでサブルーチンに渡しています。サブルーチン側はLINKAGE SECTIONでその名前を受け取って、表示しています。
4. パラメータ(引数)の渡し方
COBOLのCALL文では、複数の引数も渡すことができます。
たとえば、「名前」と「年齢」の2つを渡す例を見てみましょう。
CALL 'CHECK-AGE' USING USER-NAME USER-AGE
そして呼び出されたプログラム側では、次のように2つの値を受け取ります。
LINKAGE SECTION.
01 NAME-IN PIC A(20).
01 AGE-IN PIC 99.
PROCEDURE DIVISION USING NAME-IN AGE-IN.
ここで注意するポイント:
- 順番を守ることが重要です。渡す側と受け取る側の並び順は一致させましょう。
- データ型も一致させる必要があります(たとえばPIC A(20)やPIC 99など)。
5. CALL文の動的・静的呼び出し
実はCALLには2種類の使い方があります:
- 静的CALL:プログラム名を
'固定文字列'で指定するもの - 動的CALL:変数でプログラム名を指定するもの
例えば次のように書くと動的CALLになります:
01 PROG-NAME PIC X(10) VALUE "HELLO-PROG".
CALL PROG-NAME USING USER-NAME
このようにすれば、実行時に呼び出すプログラムを変えることも可能です。ただし、初心者のうちは'固定文字列'による静的CALLから学ぶとよいでしょう。
6. CALL文を使うときの注意点
CALL文を使う際に覚えておくべき注意点をまとめます。
- EXIT PROGRAMを必ずサブルーチンの最後に書く
- CALL元と呼び出し先のデータ形式を合わせる
- LINKAGE SECTIONと
PROCEDURE DIVISION USINGの記述を忘れない
これらを守ることで、プログラムが正しく動き、予期せぬエラーを防ぐことができます。
7. CALL文は再利用・分業に強い!
CALL文を使うことで、プログラムのパーツ化(モジュール化)が進みます。これは、チームでシステムを開発する際にも大きなメリットになります。
たとえば、顧客情報の処理・売上計算・在庫確認など、それぞれの担当者が自分の部分だけ開発して、あとでCALLで連携することができます。
また、よく使う処理をひとつのサブルーチンにしておけば、他のプログラムでも再利用でき、効率の良い開発が可能になります。
まとめ
COBOLでCALL文を使うと、ひとつの大きなプログラムを細かい処理ごとに分割でき、複雑な業務を整理しながら実装できます。今回の記事では、基本構文、パラメータの渡し方、LINKAGE SECTIONの役割、CALL文の静的呼び出しと動的呼び出し、そして実務での使いどころなどをじっくり確認しました。はじめてCOBOLを学ぶ人でも、CALL文を理解すると、プログラムを組み立てる幅がとても広がります。 CALL文は、ただ別のプログラムを呼ぶだけではありません。メインプログラムとサブルーチンの間で、値を渡し合い、結果を戻すことによって、部品のように再利用ができる点が魅力的です。同じ処理を何度も書かず、一度作った部品を別の処理から呼び出せるため、保守性が高まり、修正もしやすくなります。そして大規模なシステムのように、処理が複雑で膨大な世界でも、CALL文は分業や連携をとても楽にしてくれる大切な仕組みになります。 さらに、パラメータを複数渡す方法、引数の順番を合わせる重要性、LINKAGE SECTIONで受け取る定義をする理由、EXIT PROGRAMで正しく戻る流れなど、細かい書き方のルールも、理解してしまえば難しいものではありません。文字や数値を渡すだけでなく、状況に応じて動的に呼び出すプログラムを切り替えることもできるため、柔軟に応用できます。こうした特色は、長年にわたり多くの企業でCOBOLが使われ続ける理由のひとつです。
サンプルコードを使って復習
ここで、CALL文を使った簡単な処理を振り返ってみましょう。名前と年齢を受け取り、年齢によって表示を変える例です。
IDENTIFICATION DIVISION.
PROGRAM-ID. MAIN-CHECK.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 USER-NAME PIC X(20).
01 USER-AGE PIC 99.
PROCEDURE DIVISION.
DISPLAY "なまえを入力してください:".
ACCEPT USER-NAME
DISPLAY "ねんれいを入力してください:".
ACCEPT USER-AGE
CALL 'AGE-JUDGE' USING USER-NAME USER-AGE
STOP RUN.
続いて、呼び出されるサブルーチン側です。
IDENTIFICATION DIVISION.
PROGRAM-ID. AGE-JUDGE.
DATA DIVISION.
LINKAGE SECTION.
01 NAME-IN PIC X(20).
01 AGE-IN PIC 99.
PROCEDURE DIVISION USING NAME-IN AGE-IN.
IF AGE-IN >= 20
DISPLAY NAME-IN "さんはせいじんです".
ELSE
DISPLAY NAME-IN "さんはみせいねんです".
END-IF
EXIT PROGRAM.
このように、メインプログラムで受け付けた値をサブルーチンに渡し、サブルーチン側で条件判断をして結果を表示できます。分かれていても、ひとつの大きな処理のように動く点が、CALL文の良いところです。もし年齢の判定処理を別のプログラムでも使いたくなったときは、同じサブルーチンをそのまま呼ぶだけで再利用できます。こうした考え方は、業務の規模が大きくなるほど役に立ち、修正や仕様追加にも柔軟に対応できます。 またCALL文は、処理を分割することでプログラムの見通しをよくし、エラーの調査や変更点を追いかけやすくします。特に長く動き続けるシステムほど、こうした分割と再利用の考え方が大切になります。COBOLは古いという印象を持たれがちですが、こうした実務的な強さが多くの現場で重宝されている理由でもあります。
呼び出しの流れを整理してみよう
CALL文の動きは、電話で依頼をするような感覚に近く、流れを想像すると自然と理解が深まります。メインプログラムが「この処理をお願いします」とCALLで依頼し、サブルーチンは"必要な値を受け取り、処理し、終わったらEXIT PROGRAMで返ってくる"という仕組みです。特別な記号や複雑な型宣言を多用しなくても動かせるため、ひとつずつ落ち着いて書けば、初心者でも安心して扱える命令といえるでしょう。 さらに、パラメータを変数にして動的に切り替えれば、用途ごとに異なる処理を呼ぶこともできます。たとえば、売上計算、在庫確認、顧客情報の整形など、業務の部品を切り替えながら呼び出すことで、メインプログラムは共通の流れを保ちつつ、処理内容だけを差し替えられます。こうした柔軟な仕組みは、保守と拡張が何年も続くような企業システムにとって、とても頼りになる考え方です。
生徒
「CALL文はただ呼び出すだけじゃなくて、値の受け渡しができるところがすごく便利なんですね。」
先生
「そうです。複雑な処理をひとつのプログラムに詰め込むと、読みにくくて直しにくくなります。CALLで分ければ、きれいで分かりやすい構造になりますよ。」
生徒
「LINKAGE SECTIONやEXIT PROGRAMも大切なんですね。順番や型を揃える理由がよく分かりました。」
先生
「そのとおりです。これを意識すれば、実務で呼び出す処理にも対応できるようになります。複数のサブルーチンを連携させる大きなシステムでも活躍しますよ。」
生徒
「今回の例で、メインとサブルーチンの動き方がしっかり理解できました。自分でも色々な処理を分けながら書いてみたいです!」