関数パラメーター

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

関数パラメーターの構文図
parameterName
パラメーター名を指定します。命名の規則については、『命名規則』を参照してください。

修飾子 inOut または out (参照型に基づいていないパラメーターの場合に可能) を指定すると、パラメーター値に加えた変更が、呼び出し側関数で使用可能になります。 これらの修飾子については、後でinOut とそれに関連する修飾子の影響のセクションで説明します。 参照型の扱いについて詳しくは、『EGL における参照変数と NIL』を参照してください。

パラメーターは、他の関数への引数として受け渡すことが可能です。 それ以外の面では、パラメーターは、パラメーターを含む関数が呼び出した関数からは、不可視です。

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

partName
パーツ (レコード・パーツ、ディクショナリー、arrayDictionary、または参照型) の名前です。
固定レコードに対する入力または出力 (I/O) には以下のことが当てはまります。
  • 同一プログラム内の別の関数から渡された固定レコードには、入出力エラー値 endOfFile などのレコードの状態が含まれますが、それはレコードがパラメーターと同じレコード・タイプである場合に限られます。 同様に、レコードの状態の変更は呼び出し側に戻されるので、レコード・パラメーターに対して入出力を実行する場合、 現在の関数、呼び出し側、または現在の関数によって呼び出される関数において、 そのレコードのテストが行われることがあります。

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

  • 固定レコードに対して行われる入出力操作では、引数に指定されたレコード・プロパティーではなく、 パラメーターに指定されたレコード・プロパティーを使用します。
  • indexedRecord、mqRecord、relativeRecord、または serialRecord 型の固定レコードの場合、レコード宣言と関連付けられたファイルまたはメッセージ・キューは、 プログラム・リソースではなく実行単位リソースとして扱われます。 レコード・プロパティー fileName (または queueName) が同じ値を持つ場合は常に、ローカル・レコード宣言は同じファイル (またはキュー) を共用します。 実行単位のファイルまたはキューと関連付けるレコード数にかかわらず、 物理ファイルを一度に 1 つずつファイルまたはキュー名に関連付けることができ、EGL は、 ファイルをクローズし、再オープンすることによりこの規則を実行します。
inOut (参照型ではサポートされません)
この関数は引数値を入力として受け取り、呼び出し側は関数の終了時に、 パラメーターに加えられた変更があれば、それを受け取ります。 ただし、引数がリテラルまたは定数である場合、引数は修飾子 in が有効である場合とまったく同じように扱われます。

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

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

有限長ストリングを、修飾子が out である関数仮パラメーターとして指定する場合、長さの制限は、引数およびパラメーターの両方で同じである必要があります。

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

in (参照型ではサポートされません)
この関数は引数値を入力として受け取りますが、呼び出し側は、パラメーターに加えられた変更の影響を受けません。

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

有限長ストリングを、修飾子が in である関数仮パラメーターとして指定する場合、すべてのテキスト入力が有効です。
  • ターゲット中よりもソース中の文字が多い場合、EGL ランタイムはコピーされたコンテンツを切り捨てて使用可能な長さに合うようにします。
  • ターゲット中よりもソース中の文字が少ない場合は、EGL ランタイムはコピーされたコンテンツに空白を埋め込んで指定された長さにします。
out (参照型ではサポートされません)
この関数は引数値を入力として受け取らず、入力値は、『データの初期化』で説明されている規則に従って初期化されます。 パラメーターの値は、関数が戻るときに引数に代入されます。

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

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

有限長ストリングを、 修飾子が out である関数仮パラメーターとして指定する場合、 長さの制限は、引数およびパラメーターの両方で同じである必要があります。

dataItemPartName
この関数に対して可視であり、パラメーターの typedef (形式のモデル) として機能する DataItem パーツ。
primitiveType
プリミティブ・フィールドの型。 型に応じて、次の情報が必要になります。
  • パラメーターの長さ。メモリー領域の文字数または桁数を表す整数です。
  • 一部の数値型では、小数点以下の桁数を表す整数を指定することができます。 小数点は、データとともに保管されません。
  • INTERVAL 型または TIMESTAMP 型のフィールドには、項目値の特定の桁に意味 (「年の桁」など) を割り当てる、日時マスクを指定することができます。

サービスにおいては、パラメーターの型が ANY、BLOB、または CLOB をとることはできません。

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
nullable 修飾子は、パラメーターが NULL に設定可能であり、関数は、論理式によってパラメーターが NULL をテストするために 必要な状態情報にアクセスできることを示します。
nullable 修飾子は、以下の場合にのみ意味を持ちます。
  • ビルド記述子オプション itemsNullableyes に設定されている、または
  • 上述のビルド記述子オプションの値に関わらず、 引数が非固定レコードのフィールドであるか、SQL レコードの構造フィールドであり、 かつフィールド・レベル・プロパティー isNullableyes に設定されている。

関数が basicInterface 型のサービス・パーツまたはインターフェース・パーツに属する場合は、 第 2 のケースのみが該当します。 これは、ビルド記述子オプション itemsNullable が常に no に設定されるからです。

nullable は、修飾子 inOutin、または out が有効であるかどうかに関係なく指定できます。 ただし、inOut が有効の場合は、以下の規則が適用されます。
  • NULL 可能な引数は、NULL 可能または NULL 可能でないパラメーターと互換性があります。
  • NULL 可能でない引数には、NULL 可能でないパラメーターが必要です。 これは、パラメーターが NULL 可能であったならば、 関数はパラメーターを NULL に設定しつつ、ヌル標識を呼び出し側に戻さない可能性があるからです。

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.