プログラム呼び出し (CALL)
| 実行可能場所: すべての環境 (*ALL) スレッド・セーフ: 条件付き |
パラメーター 例 エラー・メッセージ |
プログラム呼び出し(CALL)コマンドは,コマンドで指定されたプログラムを呼び出し,制御をそのプログラムに渡します。任意に,CALLコマンドを出したプログラムまたはユーザーは,パラメーターを呼び出し先プログラムに渡すことができます。CALLコマンドはバッチ・ジョブ,対話式ジョブ,コンパイルおよび解釈の両方の制御言語(CL)で使用することができます。呼び出されたプログラムが処理を終了すると,RETURNコマンドを使用して呼び出し側プログラムに制御を戻すことができます。
CALLコマンドをCLプログラムまたはILE CLプロシージャーで出す時に,呼び出されるプログラムに渡される各パラメーター値は,文字ストリング定数,数値定数,論理定数,浮動小数点定数,またはCL変数とすることができます。浮動小数点定数が指定された場合には,値は倍精度形式に変換され,呼び出されるプロシージャーに渡されます。パラメーターを渡す場合には,定数または変数の値は呼び出されるプログラムで使用可能となります。次の形式のパラメーターを渡すことはできません。すなわち,値のリスト,修飾名,式,ヌルのパラメーター(すなわち,その値がヌルのパラメーターで,*Nで指定される),またはキーワード・パラメーターの形式です。呼び出されるプログラムには最大255個のパラメーターを渡すことができます。
CALLコマンドを使用してパラメーターをプログラムに渡す場合には,パラメーターの値は,その値がCALLコマンド上に示された順序で渡されます。すなわち,この順序は,呼び出し側プログラムのパラメーター・リストに示される順序と一致していなければなりません。
呼び出されるプログラム中のパラメーターは,その変数のかわりに使用することができます。しかし,呼び出されるプログラムの記憶域は,それが受け取る変数と関連付けられます。その代わりに,変数が渡される場合には,その変数の記憶域が初めにそれが宣言されたプログラム内に入っています。定数が渡される場合には,呼び出し先プログラムで定数のコピーが作成され,そのコピーが呼び出されるプログラムに渡されます。
その結果,変数が渡された場合には,呼び出されるプログラムはその値を変更することができ,その変更は呼び出し側プログラムに反映されることになります。定数が渡され,その値は呼び出されるプログラムによって変更された場合には,変更された値は呼び出し側プログラムには通知されません。したがって,呼び出し側プログラムが同じプログラムをもう一度呼び出すと,定数の値は元の値にリセットされます。
ジョブ投入(SBMJOB)コマンド内でのCALLコマンドを使用して変数パラメーターを渡すことの説明は,IBM I INFORMATION CENTER (HTTP://WWW.IBM.COM/SYSTEMS/I/INFOCENTER/)の「実行管理機能」トピック・コレクションにあります。
制約事項:
- 呼び出し先のプログラムに対しては操作(*OBJOPR)および実行(*EXECUTE)権限が,またそのプログラムが入っているライブラリーに対しては*EXECUTE権限が必要です。
- CALLコマンドはスレッド・セーフです。このことは,CALLコマンドが複数のスレッドを含むジョブで実行される時にこれを使用してプログラムを呼び出せることを意味します。呼び出し先のプログラムがスレッド・セーフであるかどうかの検査は行われません。
| 上 |
パラメーター
| キーワード | 記述 | 選択項目 | ノーツ |
|---|---|---|---|
| PGM | プログラム | 修飾オブジェクト名 | 必須, 定位置 1 |
| 修飾子 1: プログラム | 名前 | ||
| 修飾子 2: ライブラリー | 名前, *LIBL, *CURLIB | ||
| PARM | パラメーター | 値 (最大 255 回の繰り返し): 無制限 | オプショナル, 定位置 2 |
| 上 |
プログラム (PGM)
呼び出し先のプログラムを指定します。
これは必須パラメーターです。
修飾子1: プログラム
- 名前
- 呼び出すプログラムの名前を指定してください。
修飾子2: ライブラリー
- *LIBL
- 最初に一致するものが見つかるまで,現行スレッドのライブラリー・リスト内のすべてのライブラリーが検索されます。
- *CURLIB
- プログラムを見つけるために,スレッドの現行ライブラリーが使用されます。スレッドの現行ライブラリーとして指定されているライブラリーがない場合,QGPLライブラリーが使用されます。
- 名前
- プログラムが入っているライブラリーの名前を指定してください。
| 上 |
パラメーター (PARM)
呼び出されたプログラムに渡す1つ以上のパラメーター値を指定します。最大で255個のパラメーター値を渡すことができます。
どの値も,次のいずれかの形式で指定しなければなりません。文字ストリング定数,数値定数,論理定数,倍精度浮動小数点定数,またはプログラム変数。
各パラメーターのタイプと長さは,呼び出し側プログラムと受け取り側プログラムの両方で一致していなければなりません。また,パラメーターの数と受け渡しされる順序も同じでなければなりません。CALLコマンドが対話式または非コンパイルのバッチ環境で入力された場合には,呼び出されるプログラムで必要となるタイプおよび長さは,そのコマンドで渡される各パラメーターのものと一致していなければなりません。
パラメーターは次の通り受け渡しすることができます。
- 32バイトまたはそれより小さい文字ストリング定数は,常に32バイトの長さ(右側にブランクが埋め込まれる)で渡されます。文字定数が32バイトより長い場合には,その定数の長さ全体が渡されます。32バイトより多く入れるようにパラメーターが定義された場合には,呼び出し側プログラムはそのバイト数が正確に入っている定数を渡さなければなりません。32桁より長い定数は,受け取りプログラムで必要となる長さまでの埋め込みは行われません。
受け取りプログラムは渡されるバイト数より少なく受け取ることができます(この場合には,メッセージは送信されない)。例えば,4桁を受け取ることをプログラムが指定していて,ABCDEFが渡された(26桁目にブランクの埋め込み)場合には,ABCDだけがプログラムで受け入れられて,使用されます。引用符付きの文字ストリングも渡すことができます。
- 10進定数は,パック形式および(15 5)の長さで渡されます(値は15桁の長さで,そのうちの5桁は小数部です)。12345のパラメーターが渡された場合には,受け取りプログラムは(15 5)として10進数フィールドを宣言し,パラメーターは1234500000(これは12,345.00000)として受け取られます。
- 論理定数は'1'または'0'の論理値の1バイトとして渡されます。
- 浮動小数点リテラルおよび浮動小数点特殊値(*NAN, *INF,および*NEGINF)は,倍精度浮動小数点数として渡され,これは8バイトを占有し,SN.NESNの形式で指定されます。ここでSはプラス符号(+)またはマイナス符号(-)です。例えば,-2.47E+3または3.653E24などです。単精度浮動小数点数は呼び出されるプログラムに渡すことはできません。
- CLプログラムまたはILE CLプロシージャーから呼び出しを行う場合には,プログラム変数を渡すことができます。この場合,受け取りプログラムは,呼び出しCLプログラムまたはILE CLプロシージャーに定義された変数と一致するようにフィールドを宣言しなければなりません。例えば,CLプログラムまたはCLプロシージャーが&CHKNUMの名前の10進数変数を(5 0)として定義した場合には,受け取りプログラムは,合計5桁のパックで,小数部を持たないものとしてフィールドを宣言しなければなりません。
10進定数またはプログラム変数のいずれかを,呼び出されるプログラムに渡すことができる場合には,そのパラメーターは(15 5)として定義する必要があり,呼び出し側プログラムはその定義を支持しなければなりません。パラメーターのタイプ,数,順序,および長さが呼び出し側プログラムと受け取り側プログラムで一致しない場合(文字定数に対して前に記述された長さの例外は除く)には,予測できない結果が起こることがあります。
ヌル値を別のプログラムに渡すことができないので,値*Nを使用してヌル値を指定することはできません。
注: パラメーター値をCLプログラムまたはILE CLプロシージャーによって変更するか,あるいはCLコマンドに変数として指定する場合には,それが書き込み可能記憶域になければなりません。例えば,CまたはC++では,ストリングが読み取り専用である場合があります。読み取り専用ストリングがパラメーターとしてCLプログラムまたはILE CLプロシージャーに渡され,CLプロシージャーが変数の値を変更したり,CLコマンドの変数を使用しようとした場合には,そのCLプログラムまたはILE CLプロシージャーは正常に実行されません。
| 上 |
例
例1:プログラムの呼び出し
CALL PGM(PAYROLL)
PAYROLLという名前のプログラムが呼び出されますが,このプログラムに渡されるパラメーターはありません。ライブラリー・リストを使用して呼び出し先プログラムを見つけます。
例2:文字定数の引き渡し
CALL PGM(PAYROLL) PARM('1')
PAYROLLという名前のプログラムが呼び出され,文字定数が引用符付きストリングとして渡されます。プログラムは,最大32文字からなるフィールドを,定数を受け取るフィールドとして宣言しなければなりません。ライブラリー・リストを使用して呼び出し先プログラムを見つけます。
例3: パラメーターの引き渡し
CALL PGM(LIB1/PAYROLL) PARM(CHICAGO 1234 &VAR1)
ライブラリーLIB1に入っているPAYROLLという名前のプログラムが呼び出されます。呼び出し側プログラムは3つのパラメーター,すなわち,文字ストリング(CHICAGO), 10進値(1234.00000),およびCL変数&VAR1の内容を渡します。変数の属性が3番目のパラメーターの属性を決定します。
例4:浮動小数点値を伴うプログラムの呼び出し
CALL PGM(PGM1) PARM(1.5E3 *INF)
PGM1という名前のプログラムが呼び出され,2つの倍精度浮動小数点値がそのプログラムに渡されます。
| 上 |
エラー・メッセージ
*ESCAPE メッセージ
- CPD0783
- パラメーター&2の変数&3はTYPE(*DEC), LEN(&4,&5)でなければならない。
- CPF0005
- 戻されたコマンド・ストリングが指定した長さの変数を超えている。
- CPF0006
- コマンドでエラーが起こった。
- CPF0805
- &2のプログラム&1を開始した時にエラーが見つかった。
- CPF0806
- プロシージャーの開始時にエラーが見つかった。
| 上 |