COBOL言語初心者も安心! 難解「CALL文」をスッキリ解決 | 用語辞典

COBOL(コボル)言語の予約語CALL文を使った命令文の書き方とは

辞典・辞書-CALL-イメージ

COBOL(コボル)言語のCALL文とは?

COBOL(コボル)には、実行したプログラムから他のプログラムを呼び出したり、引数を渡してデータのやりとりが可能なCALLという機能があります。
実際のプログラムにおいて、他のプログラムとデータをやり取りする機会は、頻繁に行われます。
本記事では、CALL文について基本的な使い方やルール、注意点などをご紹介します。

書き方1:呼び出し側
CALL “呼び出すプログラム名” USING [引数1] [引数2]…

書き方2:呼び出し側
CALL “呼び出すプログラム名” USING BY CONTENT [引数1] [引数2]…
BY REFERENCE [引数]
BY CONTENT・・・値渡し
BY REFERENCE・・・参照渡し
※CONTENTとREFERENCEは省略可能です。省略時には参照渡しが適用されます。

書き方:呼び出される側(LINKAGE)
DATA DIVISION.
LINKAGE SECTION.
[データ項目1]
[データ項目2]
……

書き方:呼び出される側(USING)
PROCEDURE DIVISION USING [引数1] [引数2]…
引数には、呼び出し側で指定した引数(データ項目)と同じ型を使用します。

以下にCALL文を使用して別のプログラムを呼び出し、演算結果を取得するプログラムを紹介します。

使用例:call_sample-01.cob
辞典・辞書-CALL-使用例1

使用例:subpg-01.cob
辞典・辞書-CALL-使用例2

実行結果:
辞典・辞書-CALL-実行結果1

サンプルでは定義した集団項目をCALL文で別のプログラム”SUBPG-01″を指定して呼び出しています。
CALL文を使用すれば、処理はプログラム”SUBPG-01″に引き継がれ、参照渡しの為演算結果は呼び出し側に引き継がれます。実行結果を確認すると、呼び出し側で呼び出された側の演算結果が、正しく反映されていることがわかります。

なお、紹介したサンプルで作成したサンプルソース「subpg_01.cob」は、呼び出し元である「call_sample01.cob」と依存性があるため、ファイル単体でコンパイルを実施すると、”Error: Executable program requested but PROCEDURE/ENTRY has USING clause”のコンパイルエラーが発生してしまいます。

そのため、以下のように関連したファイルを一緒にコンパイルする必要があります。
$ cobc -x –free call_sample01.cob subpg_01.cob

CALL文のCOBOL言語における基本事項やルール

1.CALL、呼び出し元などの各要素間における空白や改行有無は自由に設定できます。

2.引数を使用するときは、USING以降に記述しなければいけません。

3.呼び出し側のプログラムに引数があるときは、呼び出された側でも必ず指定しなければいけません。各引数のデータ型やデータ長、引数の数は、呼び出すプログラムに合わせる必要があります。

4.PROCEDURE、引数、USINGなどの各要素間における空白や改行有無は自由に設定できます。

5.呼び出される側は、呼び出すプログラムの引数と同じ型を、LINKAGEに記述しなければいけません。

COBOL(コボル)言語のCALL文を扱う上での注意点

CALL文は別のプログラムを呼び出すときに便利な命令文ですが、注意しておきたい点があります。基本事項やルールで説明したとおり、引数のデータ型やデータ長は、呼び出す側のプログラムに必ず合わせる必要があります。

そのため、呼び出される側はLINKAGE SECTIONで、呼び出し側プログラムのWORKING-STRAGEで定義したデータ項目と、同じ型にしなければいけません。

しかし、呼び出される側で引数の型やデータ長に誤りがあっても、コンパイル自体は通ってしまいます。
CやJavaなどのプログラミング言語では、関数などに引き渡す型が異なると、コンパイルエラーとなりますので未然にエラーを防げますが、COBOLでCALL文を使用するときには、引数の型には十分に注意する必要があります。

誤った指定方法:呼び出し側

  1. DATA DIVISION.
  2. WORKING-STORAGE SECTION.
  3. 01 TEST-LINK-DATA.
  4. 03 WORK-NUM-1 PIC 9(03).
  5. 03 WORK-NUM-2 PIC 9(03).
  6. 03 WORK-RESULT PIC 9(06).

誤った指定方法:呼び出される側

  1. DATA DIVISION.
  2. LINKAGE SECTION.
  3. 01 SUB-DATA-1.
  4. 03 SUB-ITEM-1 PIC x(10).
  5. 03 SUB-ITEM-2 PIC 9(03).
  6. 03 SUB-RESULT PIC 9(06).

※SUB-ITEM-1が文字列の型となっているのでNGとなります。必ず呼び出し側とデータ項目を合わせる必要があります。

CALL文を使ったCOBOL(コボル)プログラムの活用法

データごとに値渡し・参照渡しを使い分けるためには、書き方2で説明したようにCONTENT(値渡し)とREFERENCE(参照渡し)を使用します。基本的にCALL文で別のプログラムを呼び出す用途としては、呼び出された側で、渡された引数の値を元に演算処理などを行うことが多く、参照渡しで使用する機会が多いと言えます。

しかし、用途によっては呼び出された側で項目の値を変えられたら困る場合は、USINGで引数を指定するときにCONTENTを使用します。
以下にCONTENT(値渡し)を使用した簡単なサンプルを紹介します。

使用例:call_sample-02.cob

*> CALL_SAMPLE02

  1. IDENTIFICATION DIVISION.
  2. PROGRAM-ID. CALL_SAMPLE02.
  3.  
  4. ENVIRONMENT DIVISION.
  5. CONFIGURATION SECTION.
  6. DATA DIVISION.
  7. WORKING-STORAGE SECTION.
  8. 01 TEST-LINK-DATA.
  9. 03 WORK-NUM-1 PIC 9(03).
  10. 03 WORK-NUM-2 PIC 9(03).
  11. 03 WORK-RESULT PIC 9(06).
  12.  
  13. PROCEDURE DIVISION.
  14. MAIN SECTION.
  15.  
  16. MOVE 10 TO WORK-NUM-1.
  17. MOVE 20 TO WORK-NUM-2.
  18.  
  19. CALL "SUBPG-02" USING BY CONTENT WORK-NUM-1
  20. WORK-NUM-2
  21. WORK-RESULT.
  22.  
  23. DISPLAY "CALL_SAMPLE02 VALUE = " WORK-RESULT UPON CONSOLE.
  24.  
  25. STOP RUN.

使用例:SUBPG-02.cob

*> SUBPG-02

  1. IDENTIFICATION DIVISION.
  2. PROGRAM-ID. SUBPG-02.
  3.  
  4. ENVIRONMENT DIVISION.
  5. CONFIGURATION SECTION.
  6. DATA DIVISION.
  7. LINKAGE SECTION.
  8. 01 SUB-ITEM-1 PIC 9(03).
  9. 01 SUB-ITEM-2 PIC 9(03).
  10. 01 SUB-RESULT PIC 9(06).
  11.  
  12. PROCEDURE DIVISION
  13. USING SUB-ITEM-1
  14. SUB-ITEM-2
  15. SUB-RESULT.
  16.  
  17. DISPLAY "IN CALLD SUBPG-02"
  18.  
  19. COMPUTE SUB-RESULT = SUB-ITEM-1 + SUB-ITEM-2.
  20. DISPLAY "SUBPG-02 VALUE = "SUB-RESULT UPON CONSOLE.
  21.  
  22. EXIT PROGRAM.

実行結果:
辞典・辞書-CALL-実行結果2

サンプルでは、呼び出し側のCALL文でプログラム呼び出し時に受け渡す引数に、CONTENTを指定しています。
渡された側のプログラムでは、演算された結果が反映されますが、呼び出し側では参照渡しではないため、演算結果が反映されていないことがわかります。

このように、CALL文を使用する場合は、呼び出した側のプログラムの用途によって、CONTENTやREFERENCEを使い分けるようにしましょう。

この記事を読んだ人は、こちらの記事も読んでいます

【未経験者歓迎】COBOLプログラマー・システムエンジニアの募集

株式会社COBOLの求人・転職・募集情報を見る

COBOL入門のカテゴリー

取引企業様 募集中
COBOL技術者 募集
COBOL魂
読者採用
COBOL入門