!--a11y-->

内部テーブルにより、固定された構造からデータを取り出し、ABAP のワークメモリに保存することができます。データは 1 行ずつメモリ内に保存されます。すべての行の構造は同じです。ABAP では、内部テーブルが配列の役割を果たします。内部テーブルは動的データオブジェクトなので、プログラマはプログラムの動的メモリ管理をする必要がなくなります。プログラム内で固定された構造のデータセットを処理する場合は、必ず内部テーブルを使ってください。内部テーブルの特に重要な機能は、プログラム内のデータベーステーブルのデータを保存し、フォーマットすることです。非常に複雑なデータ構造を ABAP プログラムに記述する場合も役立ちます。
ABAP タイプコンセプトのすべてのエレメント同様、内部テーブルはデータ型としてもデータオブジェクトとしても存在します。データ型は、プログラムや ABAP ディクショナリでの内部テーブルの抽象的な表現です。データ型を使って具体的なデータオブジェクトが登録されます。データ型も既存のデータオブジェクトの属性です。
内部テーブルと構造は、ABAP 構造化データ型です。内部テーブルのデータ型は、行データ型、キー、テーブルデータ型によってフル指定されます。
内部テーブルの行データ型は、どのデータ型でも構いません。通常のデータ型は、構造です。構造の各コンポーネントは、内部テーブルの列となります。ただし、行データ型が基本データ型の場合や内部テーブルの場合もあります。
キーはテーブルの行を識別します。内部テーブルには、標準キーとユーザ定義キーの 2 種類のキーがあります。キーは UNIQUE か NON-UNIQUE に指定することができます。一意キーを持つ内部テーブルは、複製エントリを持つことができません。一意性は、テーブルアクセス方法に左右されます。
テーブルが構造化された行データ型を持つ場合、デフォルトキーは、参照ではない非数値列と内部テーブルである列によって構成されます。テーブルが基本行データ型を持つ場合、デフォルトキーは行全体です。行データ型が内部テーブルの内部テーブルのデフォルトキーは、空です。
ユーザ定義キーには、参照ではない内部テーブルまたは内部テーブル自身の列を含めることができます。ユーザ定義キーを持つ内部テーブルは、キーテーブルと呼ばれます。キーを定義する場合は、キー項目の順序が重要です。たとえば、テーブルをキーでソートする場合に、キー項目の順序が重要になります。
テーブルデータ型によって、ABAP の個別のテーブルエントリへのアクセス方法が決まります。内部テーブルは、3 種類に分けられます。
標準テーブルは、内部明細索引を持っています。内部テーブルの索引は上方向にツリーとして管理されます。この場合、索引管理のオーバーヘッドは対数で増加し、行数と直線的な関係にはなりません。システムは、テーブル索引またはキーを使ってレコードにアクセスすることができます。キーアクセスの応答時間は、テーブル内のエントリ数に比例します。標準テーブルのキーが一意になることはありません。また、一意のキーを指定することはできません。つまり、既存のエントリの有無をチェックする必要がないので、標準テーブルは常にすばやく書き込まれます。
ソートテーブルは常にキーでソートされて保存されます。ソートテーブルには、内部索引もあります。システムは、テーブル索引またはキーを使ってレコードにアクセスすることができます。バイナリ検索が行われるので、キーアクセスの応答時間はテーブルエントリ数に対数比例します。ソートテーブルのキーは、一意の場合と一意でない場合があります。テーブルを定義するときは、キーが一意かどうかを指定してください。標準テーブルとソートテーブルは、まとめて索引テーブルと呼ばれます。
ハッシュテーブル は、非線形索引を持っています。ハッシュテーブルには、キーを使ってアクセスします。ハッシュアルゴリズムでテーブルエントリへのアクセスが行われるので、応答時間はテーブルエントリ数にかかわらず一定しています。ハッシュテーブルのキーは、一意でなければなりません。テーブルを定義する場合は、キーを UNIQUE に指定してください。
プログラム内の他のローカルデータ型と異なり、内部テーブルのデータ型をフル指定する必要はありません。内部テーブルのデータ型のキー、またはキーと行データ型を指定しないジェネリック構造を指定することも可能です。ジェネリック内部テーブルを使って、フィールドシンボルとプロシージャのインタフェースパラメータを指定することができます。これらを使って、データオブジェクトを宣言することはできません。
内部テーブルのデータ型または、内部テーブルとして直接定義されたデータオブジェクトは、常に行データ型、キー、アクセス方法が詳細に定義されています。ただし、行数は固定されていません。内部テーブルは特定のデータ型の任意の数の行を含むことができるので、動的データオブジェクトであるといえます。内部テーブルの行数に関する唯一の制限は、システムインストレーションに関する制限です。内部テーブル ( 内部管理も含む) が占めることができるメモリサイズは、最大 2 ギガバイトです。現実には、500 メガバイト以下になります。さらに、ハッシュテーブルでは、エントリ数が 200 万以下に制限されています。内部テーブルの行データ型は、どの ABAP データ型 ( 基本、構造化、内部テーブル) でも構いません。内部テーブルの各行は、テーブル行またはテーブルエントリと呼ばれます。構造行の各コンポーネントは、内部テーブルの列と呼ばれます。
使われるテーブルデータ型 ( および特にアクセス方法) は、典型的な内部テーブル操作が一番よく実行される方法によって異なります。
索引を使って各テーブルエントリをアドレスする場合は、標準テーブルが最も適しています。索引アクセスは、最速のアクセス方法です。行をアペンドして (ABAP APPEND 命令) 標準テーブルに書き込み、索引を指定して ( 適当な ABAP コマンドの INDEX オプション) データエントリを読み込み、変更、削除します。標準テーブルへのアクセス時間は、テーブルエントリの数と直線的な関係で増加します。キーアクセスが必要で、複数のステップでテーブルに書き込みや処理を行う場合は、標準テーブルが特に有効です。たとえば、エントリをアペンドしてテーブルに書き込んだ後、ソートすることもできます。キーアクセスのバイナリ検索オプションを使う場合は、応答時間はテーブルエントリ数に対数比例します。
書き込みと同時にテーブルをソートしたい場合は、ソートテーブルが最も適しています。ソートテーブルへは、INSERT 命令で書き込みます。エントリは、テーブルキーで定義されたソート順序に従い挿入されます。不正なエントリは、テーブルに追加する時点で認識されます。バイナリ検索が常に行われるので、キーアクセスの応答時間はテーブルエントリ数に対数比例します。WHERE 条件にテーブルキーの最初の部分を指定し、LOOP 内の順次処理を部分的に実行する場合は、ソートテーブルが特に有効です。
キーアクセスが主な作業のテーブルには、ハッシュテーブルが最適です。ハッシュテーブルには、索引を使ってアクセスすることはできません。キーアクセスの応答時間は、テーブルエントリ数にかかわらず一定です。データベーステーブル同様、ハッシュテーブルは常に一意のキーを持ちます。データベーステーブルのような内部テーブルを構築、使用する場合や、大量のデータを処理する場合には、ハッシュテーブルが有効です。
