関数パラメーター

関数パラメーターの構文図は、以下のとおりです。

関数パラメーターの構文図
parameterName
パラメーターの名前を指定します。パラメーターの名前は、レコードまたはデータ項目、 あるいはレコードまたはデータ項目の配列とすることができます。命名の規則については、『命名規則』を参照してください。

修飾子 inOut または out を指定すると、パラメーター値に加えた変更を呼び出し側関数で使用できます。 これらの修飾子については、後で『inOut とそれに関連する修飾子の影響』のセクションで説明します。

パラメーターに加えた変更は、受け取り側関数によって呼び出される関数の中で使用できますが、そのパラメーターが引き数として渡される場合に限ります。

大括弧 ([]) で終了するパラメーターは動的配列であり、 その他の仕様はその配列の各要素の性質を宣言します。

inOut
関数は引き数値を入力として受け取り、呼び出し側は関数の終了時に、パラメーターに加えられた変更があれば、それを受け取ります。 ただし、引き数がリテラルまたは定数である場合、引き数は修飾子 in が有効である場合とまったく同じように扱われます。

inOut 修飾子が必要になるのは、パラメーターが項目であり、修飾子 field を指定した場合です。後者の修飾子は、パラメーターが blanksnumeric など、テスト可能な書式フィールド属性を持つことを示します。

パラメーターがレコードである場合は、以下の規則が適用されます。
  • そのレコードを使用して現行の関数 (または現行の関数によって呼び出される関数) の中でファイルまたはデータベースにアクセスする意図がある場合は、inOut 修飾子を指定するか、デフォルトでその修飾子を受け入れる必要があります。
  • レコード・タイプが引き数とパラメーターについて同じである (例えば、両方ともシリアル・レコードである) 場合、ファイルの終わりの状況など、レコード固有の状態情報が呼び出し側に戻されます。ただし、inOut 修飾子が有効である場合に限られます。
in
関数は引き数値を入力として受け取りますが、呼び出し側は、パラメーターに加えられた変更の影響を受けません。

field 修飾子を持つ項目に in 修飾子を使用することはできません。 また、現行の関数の中、または現行の関数によって呼び出される関数の中でファイルまたはデータベースにアクセスするために使用されるレコードに in 修飾子を指定することもできません。

out
関数は引き数値を入力として受け取らず、入力値は、『データの初期化』で説明されている規則に従って初期化されます。 呼び出し側は、パラメーターに加えられた変更による影響を受けます。

引き数がリテラルまたは定数である場合、引き数は修飾子 in が有効である場合とまったく同じように扱われます。

field 修飾子を持つ項目に out 修飾子を使用することはできません。 また、現行の関数の中、または現行の関数によって呼び出される関数の中でファイルまたはデータベースにアクセスするために使用されるレコードに out 修飾子を指定することもできません。

recordPartName
関数に可視であり、パラメーターの typedef (形式のモデル) として機能するレコード・パーツ。可視のパーツの詳細については、 『パーツの参照』を参照してください。
指定されたレコードに対する入力または出力 (I/O) に以下のことが当てはまります。
  • 別の関数から渡されたレコードには、入出力エラー値 endOfFile などのレコードの状態が含まれますが、それはレコードがパラメーターと同じレコード・タイプである場合に限られます。 同様に、 レコードの状態の変更は呼び出し側に戻されるので、レコード・パラメーターに対して入出力を実行する場合、 現在の関数、呼び出し側、または現在の関数によって呼び出される関数において、そのレコードのテストが行われることがあります。

    ライブラリー関数はレコードの状態を受け取りません。

  • レコードに対して行われる入出力操作は、 引き数に指定されたレコード・プロパティーではなく、パラメーターに指定されたレコード・プロパティーを使用します。
  • indexedRecord、mqRecord、relativeRecord、または serialRecord タイプのレコードの場合、 レコード宣言と関連付けられたファイルまたはメッセージ・キューは、 プログラム・リソースではなく実行単位リソースとして扱われます。レコード・プロパティー fileName (または queueName) が同じ値を持つ場合、 ローカル・レコード宣言は同じファイル (またはキュー) を共用します。実行単位のファイルまたはキューと関連付けるレコード数にかかわらず、 物理ファイルを一度に 1 つずつファイルまたはキュー名に関連付けることができ、EGL は、 ファイルをクローズし、再オープンすることによりこの規則を実行します。
dataItemPartName
関数に可視であり、パラメーターの typedef (形式のモデル) として機能する dataItem パーツ。
primitiveType
パラメーターのプリミティブ型。同名のトピックに説明があります。
length
パラメーターの長さ。parameterName によって参照されるメモリー領域の文字数または桁数を表す整数です。
decimals
一部の数値型には、decimals を指定できます。これは、小数点以下の桁数を表す整数です。 小数部の桁の最大数は、18 または length で宣言された桁数の小さいほうです。小数点は、データとともに保管されません。
"dateTimeMask"
INTERVAL 型または TIMESTAMP 型の項目には、"dateTimeMask" を指定できます。これは、項目の値の特定の位置に意味 (「年の桁」など) を割り当てるものです。 このマスクは、データと一緒には格納されません。
looseType
loose type は関数パラメーターのためにのみ使用する特殊な種類の基本タイプです。パラメーターが、ある範囲の引き数長さを受け入れる場合に、 このタイプを使用します。利点は、関数を繰り返し呼び出し、毎回異なる長さの引き数を渡すことができる点です。
有効な値は以下のとおりです。
  • CHAR
  • DBCHAR
  • HEX
  • MBCHAR
  • NUMBER
  • UNICODE

パラメーターがプリミティブ型と長さの数値を受け入れるようにする場合、loose type として NUMBER を使用します。この場合、 パラメーターに渡される数値は小数点以下の桁を持たない必要があります。

パラメーターが特定のプリミティブ型であるが、 任意の長さのストリングを受け入れるようにする場合は、CHAR、DBCHAR、MBCHAR、HEX、または UNICODE を loose type として指定し、 引き数が対応するプリミティブ型であることを確認します。

loose type は、ライブラリー に宣言される関数には使用できません。

プリミティブ型の詳細については、『プリミティブ型』を参照してください。

field
パラメーターが blanks または numeric などの書式フィールド属性を持つことを示します。 これらの属性は論理式でテストすることができます。

field 修飾子を使用できるのは、inOut 修飾子を指定した場合か、デフォルトで inOut 修飾子を受け入れた場合だけです。

field 修飾子は、nativeLibrary 型のライブラリー内の関数パラメーターには使用できません。

nullable
パラメーターの以下の特性を示します。
  • パラメーターが NULL 設定可能である。
  • 論理式で切り捨てや NULL があるかどうかをテストするために必要な状態情報にパラメーターでアクセスする。
パラメーターに渡される引き数が SQL レコード内の構造体項目である場合にのみ、nullable 修飾子は意味があります。 以下の規則が適用されます。
  • 項目プロパティー isNullableyes に設定されている場合にのみ、パラメーターは、NULL 設定したり、NULL があるかどうかをテストすることができます。
  • Java™ プログラムでは、isNullable の値にかかわらず、切り捨てをテストする機能が使用可能です。ただし、COBOL プログラムでは、isNullableyes に設定されている場合にのみ、切り捨てをテストする機能が使用可能です。
  • nullable は、修飾子 inOutin、または out が有効であるかどうかに関係なく指定できます。

inOut とそれに関連する修飾子の影響

修飾子 inOutout、および in をよく理解するために、次の例を検討してください。この例では、さまざまな実行ポイントで、さまざまな変数の値を (コメントの中で) 示しています。
program inoutpgm 
	a int;
	b int;
	c int;

	function main()
		a = 1;
		b = 1;
		c = 1;

		func1(a,b,c);

		// a = 1          
		// b = 3          
		// c = 3 		
	end

	function func1(x int in, y int out, z int inout)
		// a = 1          x = 1
		// b = 1          y = 0
		// c = 1          z = 1
		
		x = 2;
		y = 2;
		z = 2;

		// a = 1          x = 2
		// b = 1          y = 2
		// c = 2          z = 2

		func2();
		func3(x, y, z);
		// a = 1          x = 2
		// b = 1          y = 3
		// c = 3          z = 3

	end

	function func2()
		// a = 1          
		// b = 1          
		// c = 2          
			
	end

	function func3(q int in, r int out, s int inout)
		// a = 1          x = 未解決   q = 2
		// b = 1          y = 未解決   r = 2
		// c = 2          z = 未解決   s = 2
		
		q = 3;
		r = 3;
		s = 3;

		// a = 1          x = 未解決   q = 3
		// b = 1          y = 未解決   r = 3
		// c = 3          z = 未解決   s = 3


	end
	
ご利用条件 | フィードバック
(C) Copyright IBM Corporation 2000, 2005. All Rights Reserved.(C) Copyright IBM Japan 2005.