配列入門
配列データでの作業 へ戻る
InterBase は、ほとんどのデータ型の配列をサポートしています。 配列を使用すると、複数のデータ項目を、単一の列に格納することができます。 InterBase は配列を、単一のユニットとして、または一連のユニット集まり(スライスと呼ばれる)として扱うことができます。 配列の利用は次のときに適しています:
- データ項目群が、同じデータ型のセットを自然に形成している場合。
- 1 つのデータベース列にあるデータ項目群のセット全体が、1 つのユニットとして表現および制御される必要がある場合。各項目を別の列にそれぞれ格納しない場合。
- しかしながら、各項目を個別に識別しアクセスする必要がある場合。
配列内のデータ項目は、配列要素と呼ばれます。 配列は、Blob 以外のいずれの InterBase データ型の要素も格納することができますが、配列を要素して配列を作ることはできません。 配列の要素はすべて、同じデータ型でなければなりません。
InterBase は、多次元の配列をサポートしており、1 ~ 16 次元まで作成することができます。 多次元配列は、行優先順で格納されます。
配列の次元には、添字と呼ばれる、上限から下限までの特定の範囲があります。 配列の添え字は、配列型の列が作成された際に定義されます。 配列作成の詳細については、『言語リファレンス ガイド』を参照してください。
配列フィールド型は、isql でのみ変更できます。 この状況は、開発者が IBConsole を FireDAC に変更するまで適用されます。
配列のデータベースへの格納
InterBase は、配列データを直接テーブル レコードの配列フィールドに格納しません。 代わりに、配列 ID をそこに格納します。 配列 ID は、配列データを参照する一意の数字の値で、配列データはデータベースの別の場所に格納されます。
配列ディスクリプタ
An 配列ディスクリプタ は、ISC_ARRAY_DESC_V2 構造体に対して読み書きされる、配列または配列のサブセットを記述します。ISC_ARRAY_DESC_V2 は、InterBase ヘッダー ファイルで次のように定義されます:
typedef struct {
short array_desc_version;
unsigned char array_desc_dtype;
char array_desc_scale;
unsigned short array_desc_length;
char array_desc_field_name [METADATALENGTH];
char array_desc_relation_name [METADATALENGTH];
short array_desc_dimensions;
short array_desc_flags;
ISC_ARRAY_BOUND array_desc_bounds [16];
} ISC_ARRAY_DESC_V2;
ISC_ARRAY_BOUND は、次のように定義されます:
typedef struct {
short array_bound_lower; /* lower bound */
short array_bound_upper; /* upper bound */
} ISC_ARRAY_BOUND;
| フィールド | 説明 |
|---|---|
|
|
|
|
|
データ型(以下参照) |
|
|
数値データ型の小数点以下の桁数 |
|
|
配列の各要素の長さ(バイト) |
|
|
NULL 終端の列名 |
|
|
NULL 終端の関係名 |
|
|
配列の次元数 |
|
|
配列が、列が行のどちらを優先順としてアクセスされるかを指定
|
|
|
各次元の上限/下限 |
ISC_ARRAY_DESC_V2 構造体は、長さ METADATALENGTH の、長いメタデータ名をサポートしています。 古い ISC_ARRAY_DESC 構造体は、32 バイト以下のメタデータ名しかサポートしません。array_desc_version フィールドは ARRAY_DESC_CURRENT_VERSION に、isc_array_lookup_bounds2()、isc_array_lookup_desc2()、isc_array_set_desc2() によって設定されます。
配列ディスクリプタの array_desc_dtype フィールドは、次の表のいずれかのデータ型で表現されなければなりません:
| array_desc_dtype の値 | 対応する InterBase データ型 |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
配列ディスクリプタは、16 の ISC_ARRAY_BOUND 構造体を保有しており、それぞれが利用可能な次元を表しています。 <n> 次元の配列は、先頭の <n> 個の ISC_ARRAY_BOUND 構造体に対する、上限と下限が設定されています。 実際の配列次元の数は、配列ディスクリプタの array_desc_dimensions フィールドで指定されます。
データを配列から取得する際、抽出される配列 slice(配列全体、または連続した配列要素からなるサブセット)を定義した配列ディスクリプタを用意します。 同様に、配列にデータを書き込む際、書き込まれる配列スライスを定義した配列ディスクリプタを用意します。
配列ディスクリプタに値を設定する
配列ディスクリプタへ値を設定するには、4 つの方法があります:
isc_array_lookup_desc2()を呼び出す。指定されたテーブルの指定された配列型の列について、そのデータ型、長さ、桁数、次元を、(システム メタデータ テーブル内を)検索し、配列ディスクリプタに格納します。 この関数はまた、テーブル名および列名をディスクリプタに格納し、そのarray_desc_flagsフィールドを初期化して、配列が行優先順でアクセスされるよう指示します。 たとえば、
isc_array_lookup_desc2( status_vector,
&db_handle, /* Set by isc_attach_database() */
&tr_handle, /* Set by isc_start_transaction() */
"PROJ_DEPT_BUDGET", /* table name */
"QUART_HEAD_CNT", /* array column name */
&desc); /* descriptor to be filled in */
isc_array_lookup_bounds2()を呼び出す。isc_array_lookup_desc2() への呼び出しと同様ですが、isc_array_lookup_bounds2() は、各次元の上限と下限も検索し、配列ディスクリプタに格納します。isc_array_set_desc2()を呼び出す。これは、データベースのメタデータにアクセスすることではなく、パラメータからディスクリプタを初期化します。 たとえば、
short dtype = SQL_TEXT;
short len = 8;
short numdims = 2;
isc_array_set_desc2( status_vector,
"TABLE1", /* table name */
"CHAR_ARRAY", /* array column name */
&dtype, /* data type of elements */
&len, /* length of each element */
&numdims, /* number of array dimensions */
&desc); /* descriptor to be filled in */
- ディスクリプタのフィールドを直接設定します。 次は、ディスクリプタ
descのarray_desc_dimensionsフィールドを設定する例です:
desc.array_desc_dimensions = 2;
isc_array_lookup_bounds2()、isc_array_lookup_desc2()、isc_array_set_desc2() の全構文および情報については、「API 関数リファレンス」を参照してください。