関数パラメーター

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

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

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

パラメーターは、そのパラメーターを含む関数によって呼び出される関数に可視ではありません。 ただし、パラメーターを引数としてそうした他の関数に渡すことはできます。

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

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

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

パラメーターが (固定レコードではなく) レコードである場合、有効なのは、inOut 修飾子だけです。

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

inOut 修飾子が有効でない場合は、関連する引数は、『EGL での参照の互換性』での説明のとおり、パラメーターと参照の互換性がある必要があります。

in
関数は引数値を入力として受け取りますが、呼び出し側は、パラメーターに加えられた変更の影響を受けません。

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

out
関数は引数値を入力として受け取らず、入力値は、『データの初期化』で説明されている規則に従って初期化されます。パラメーターの値は、関数が戻るときに引数に代入されます。

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

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

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

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

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

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

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

引数の定義によって、関数のステートメントが 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.