構造化レコード
外部ファイル・レコードのレイアウトを適切に設定したり、データ・フィールドがパラメーター・バッファー内で適切な位置にあることを要求する外部プログラムを呼び出す場合に、構造化レコード定義を使用します。
構造化レコードには、次の特性があります。
- レコードはストレージ内で固定レイアウトになります。
- レコードは固定量のストレージを専有します。
- 変数値は、ストレージ領域内で固定オフセットおよび固定長で表示されます。
構造化レコードを作成するときは、レベル番号を使用してストレージ内のレコード・フィールドのレイアウトを適切に指定します。
構造化レコード内のフィールドのタイプは、固定長でなければなりません。EGL は、構造化フィールド (構造化レコード・フィールド) 内で以下のタイプをサポートします。
- 固定長または指定した長さ (STRING でない INT または CHAR(10) など) を持つプリミティブ型またはデータ項目
- 他の構造化レコード、ただし、フィールドは CHAR 型として切り捨て
- 固定次元のある、上記のいずれかの種類の配列
構造化レコードの特殊なケースとして、可変長レコードがあります。この場合、EGL は変数を確認することによって、レコードのサイズを判別するために必要な情報を見つけます。詳しくは、可変長レコードを参照してください。
副構造化レコード
構造化レコード内の各フィールドは、副構造を持つ ことができます。つまり、より小さいフィールドの合計として宣言することができます。各フィールドに任意のレベル番号を割り当てます。レベル番号が大きいものは、副構造フィールドを表します。次の例では、電話番号を保持するフィールドを定義します。
Record CustomerRecord type BasicRecord
10 phoneNumber CHAR(10);
20 areaCode CHAR(3);
20 localNumber CHAR(7);
end
このレコード・パーツ (myCustomer など) に基づいて変数を宣言し、 変数に情報を読み込むと、myCustomer.phoneNumber として電話番号全体にアクセスできます。 また、ドット構文 (例えば、myCustomer.phoneNumber.localNumber、またはもっと単純に、myCustomer.localNumber) を使用して、部分的な電話番号にアクセスすることができます。
フィールドとしての構造化レコード
次の例は、別の構造化レコードをフィールドとして含む
構造化レコードを示します。
record Outer
5 a INT;
5 b Inner; // looks like a record, but is actually CHAR
end
record Inner
10 c CHAR(10);
15 c2 CHAR(10);
10 d CHAR(10);
end
フィールド Outer.b は、レコードを参照
する Inner 型を使用して定義されています。一方、Outer.b の
実際の型は CHAR(20) です。CHAR フィールドの長さは、レコードの全長によって決定されます。Outer レコードは、代わりに、次のように定義することもできます。
record Outer
5 a INT;
5 b CHAR(20);
10 c CHAR(10);
15 c2 CHAR(10);
10 d CHAR(10);
end
入出力での構造化レコード
構造化レコードは、階層データベース、メッセージ・キュー、または索引付きファイルなど、
特定の種類のデータ・アクセス・テクノロジーによって、入出力に使用される場合が最も多いケースです。
次のレコードのステレオタイプの場合、EGL は、フィールドにレベル番号が含まれていなくても構造化レコードを想定します。
- IndexedRecord
- RelativeRecord
- SerialRecord
- MQRecord
ここでのベスト・プラクティスは、これらのレコードでレベル番号を使用して、構造化されていることを明確にすることです。詳しくは、このトピックの最後にある『関連参照』を参照してください。