CALL ステートメントは実行単位の中で、あるプログラムから別のプログラムに制御を渡します。
CALL ステートメントを含むプログラムは、呼び出し側プログラムです。 また、CALL ステートメントに示されるプログラムは、呼び出し先サブプログラムです。 呼び出し側プログラムには、他のプログラムを呼び出す時点で CALL ステートメントが入っていなければなりません。
ILE COBOL では、サブプログラムは COBOL プログラム、他の IBM® i 言語で書かれたプログラム、または ILE プロシージャーである可能性があります。
CALL ステートメントの処理によって、呼び出し先サブプログラムの非宣言の最初の命令へ制御が渡されます。 呼び出し側プログラムへ制御が戻る場合の戻り先は、CALL ステートメントの次の命令です。 呼び出し先サブプログラムに手続き部、または手続き部の非宣言セクションがない場合には、その呼び出し先サブプログラムは暗黙の EXIT PROGRAM を出します。
プログラム制御が CALL ステートメントによって移され、 呼び出し先プログラムが、直接または間接的に、呼び出し元のプログラムを実行すると、 再帰呼び出しが行われたことになります。RECURSIVE 属性が定義 されたプログラムは、直接または間接的にそれ自身を実行する CALL ステートメントを 実行できます。ILE COBOL では、非再帰的プログラムで再帰を行うことはできません。非再 帰的プログラムに対して再帰を試みると、実行時エラー・メッセージが生成されます。呼び出し側プログラムおよび関連した概念と用語について詳しくは、「IBM Rational Development Studio for i: ILE COBOL プログラマーの手引き」を参照してください。
RETURN-CODE 特殊レジスターを使用すれば、あるプログラムからその呼び出し側プログラムに戻りコードの情報を渡すことができます。 詳しくは、RETURN-CODE 特殊レジスターを参照してください。
CALL ステートメントの処理は、呼び出し先サブプログラムに制御を渡します。 CALL ステートメントにプログラム・オブジェクトのリンケージがあり、その CALL ステートメントが実行時に、指定されたライブラリー内に存在していないプログラム・オブジェクトを指定すると、エラー・メッセージが出されます。 ON EXCEPTION 句または OVERFLOW 句を使用して、エラー処理のプロシージャーを指定することが可能です。
呼び出し先サブプログラムは、実行単位の中で最初に呼び出されたときには初期状態になっています。 また、CANCEL ステートメントの後で最初に呼び出されたときにも初期状態になっています。
プログラムが初期プログラムである (その PROGRAM-ID 段落に INITIAL 文節が含まれている) 場合、 そのプログラムは呼び出されるごとにその初期状態になります。 それ以外の場合はすべて、呼び出し先サブプログラムに入ったとき、 そのサブプログラムは最後に使われた状態のままですが、PERFORM ステートメントの制御メカニズムの場合は除きます。 PERFORM ステートメントの制御メカニズムでは、常にそれらの初期状態に設定されます。
暗黙の、または明示の STOP RUN が生じると、言語とユーティリティーの戻りコードは 0 に設定されます。 そうでない場合は、2 に設定されます。 RETURN-CODE レジスターが作業制御ブロックのユーザー部分にコピーされます。 戻りコードの詳細については、「CL プログラミング」の RTVJOBA コマンド および DSPJOB コマンドを参照してください。
ユーザー戻りコードは、COBOL プログラムの実行開始後と他のプログラムに対して呼び出しが行われる前には 0 にセットされます。
CALL ステートメント - 形式 1 >>- CALL--------------------------------------------------------> >--+-ID-1---------------------------------------------------+---> '-+--------------------------------------------+--リテラル-1-' | (1) | +-LINKAGE------+------+--+----+--+-環境名-1---+-+ | '-TYPE-' '-IS-' '-PROGRAM-' | | (1) | '-PROGRAM------------------------------------' >--+---------------------------------+--------------------------> | (1) | '-+----+--LIBRARY------+-ID-5---+-' '-IN-' '-リテラル-4-' >--+---------------------+--------------------------------------> | .----------. | | V | | '-USING----| BY 句 |-+-' >--+-| ON EXCEPTION 句 |--| NOT ON EXCEPTION 句 |-+---------------> '-+----+--OVERFLOW--命令ステートメント-3--------------' '-ON-' >--+----------+------------------------------------------------>< '-END-CALL-' BY 句 .------------------------------. V | |--+-+-------------------+----+-+----------------+--ID-2-+-+-+--| | '-+----+--REFERENCE-' | | (1) | | | | '-BY-' | '-ADDRESS OF-----' | | | | (1) | | | '---ファイル名-1----------------' | | .------------------------------. | | V | | '-+----+--CONTENT----+-+----------------+--ID-2-+-+-------' '-BY-' | | (1) | | | +-ADDRESS OF-----+ | | | (1) | | | '-LENGTH OF------' | | (1) | '-+-リテラル-2------+----------' | (1) | '-ファイル名-1-----' ON EXCEPTION 句 |--+----+--EXCEPTION--命令ステートメント-1-------------------------------| '-ON-' NOT ON EXCEPTION 句 |--NOT--+----+--EXCEPTION--命令ステートメント-2--------------------------| '-ON-'
CALL ステートメント - 形式 2 >>- CALL--------------------------------------------------------> >--+-ID-1-----------------------------------------------------+--> '-+----------------------------------------------+--リテラル-1-' | (1) | +-LINKAGE------+------+--+----+--+-環境名-1-----+-+ | '-TYPE-' '-IS-' '-PROCEDURE-' | | (1) | '-PROCEDURE------------------------------------' >--+---------------------+--------------------------------------> | .----------. | | V | | '-USING----| BY 句 |-+-' >--+---------------------------------------------------+--------> | (1) | '-+-RETURNING-----+--+------+--+------------+--ID-4-' | (1) | '-INTO-' '-ADDRESS OF-' '-GIVING--------' >--+--------------------------------------------+---------------> +-| ON EXCEPTION 句 |--| NOT ON EXCEPTION 句 |-+ '-+----+--OVERFLOW--命令ステートメント-3--------------' '-ON-' >--+----------+------------------------------------------------>< '-END-CALL-' BY 句 .------------------------------. V | |--+-+-------------------+----+-+----------------+--ID-2-+-+-+--| | '-+----+--REFERENCE-' | | (1) | | | | '-BY-' | '-ADDRESS OF-----' | | | | (1) | | | '-+-ファイル名-1-----+----------' | | | (1) | | | '-OMITTED-----' | | .------------------------------. | | V | | +-+----+--CONTENT----+-+----------------+--ID-2-+-+-------+ | '-BY-' | | (1) | | | | | +-ADDRESS OF-----+ | | | | | (1) | | | | | '-LENGTH OF------' | | | | (1) | | | '-+-リテラル-2------+----------' | | | (1) | | | +-ファイル名-1-----+ | | | (1) | | | '-OMITTED-----' | '-| BY VALUE 句 |------------------------------------------' BY VALUE 句 .-------------------------------------. (1) V | |--+----+--VALUE--------+-+------------+--ID-3------------+-+---| '-BY-' | +-ADDRESS OF-+ | | '-LENGTH OF--' | '-+-リテラル-3----------------------+-' '-+-浮動リテラル-1-+--| SIZE IS 句 |-' '-整数-1-----' SIZE IS 句 |--+--------------------+---------------------------------------| '-SIZE--+----+--整数-2-' '-IS-' ON EXCEPTION 句 |--+----+--EXCEPTION--命令ステートメント-1-------------------------------| '-ON-' NOT ON EXCEPTION 句 |--NOT--+----+--EXCEPTION--命令ステートメント-2--------------------------| '-ON-'
プロシージャー・ポインター・データ項目は、CALL の前に SET ステートメントを使用して、 プロシージャーまたはプログラムのアドレスに設定する必要があります。 プロシージャー・ポインター・データ項目の設定方法について詳しくは 形式 6 - プロシージャー・ポインター・データ項目を参照してください。
リンケージが ILE プロシージャーに対するものであれば、リテラル-1 は非数字で長さが最大 256 文字でなければなりません。 コンパイラー・オプション *MONOPRC によって、リテラル-1 が英大文字で指定されており、プログラム名の形成規則に従っている必要があります。 このリテラルは、呼び出し先サブプログラムのプログラム名を指定していなければなりません。