隠し列

表列が暗黙的な隠し属性によって定義されると、明示的に参照されなければ、その列は使用できません。 例えば、SELECT * 照会を表に対して実行した場合、暗黙的な隠し列は結果表に返されません。 暗黙的な隠し列は、列名を指定できる場所ならどこででも、明示的な方法で参照が可能です。

列とその項目がデータベース・マネージャーによって生成される場合、その列を IMPLICITLY HIDDEN として定義することで、アプリケーションに与える潜在的な悪影響を最小限に抑えることができます。 例えば、システム期間テンポラル表に、データベース・マネージャーによって生成される値を持つ 3 つの列が含まれているとします。 データベース・マネージャーはそれらの列を使用して、各表の行の履歴バージョンを保持します。 ほとんどのビジネス・アプリケーションは履歴データを処理しますが、生成されるこれら 3 つの列を処理するものは希少です。 これらの列をアプリケーションから隠すことで、アプリケーションの処理時間を減らすことができます。

データを表に挿入する際に、列リストを持たない INSERT ステートメントは暗黙的な隠し列の値を想定していません。 この場合、入力データに暗黙的な隠し列の値が含まれていると、その値に対応するターゲット列がないので、エラーが返されます (SQLSTATE 42802)。 列リストを持たない INSERT ステートメントに暗黙的な隠し列の値が含まれないため、暗黙的な隠し列および NOT NULL として定義されている列には定義済みのデフォルト値がなければなりません。

入力ファイルから表にデータを設定する場合、IMPORT、INGEST、LOAD などのユーティリティーの使用時には、隠し列のデータが操作に含まれるかどうかを指定する必要があります。 列リストを指定しない場合、データ移動ユーティリティーは、暗黙的な隠し列が含まれる表を処理するときに、implicitlyhiddeninclude ファイル・タイプ修飾子または implicitlyhiddenmissing ファイル・タイプ修飾子を使用する必要があります。 DB2_DMU_DEFAULT レジストリー変数を使用して、データ移動ユーティリティーが暗黙的な非表示列を持つ表を検出した場合のデフォルトの動作を設定することもできます。 同様に、EXPORT の場合も、非表示列のデータを操作に含めるかどうかをユーザーが指定する必要があります。

表列の暗黙的な隠し列属性は、CREATE TABLE ステートメント(新規表の場 合) または ALTER TABLE ステートメント(既存の表) を使用して定義することができます。 LIKE 節を指定した CREATE TABLE ステートメントを使用して表を作成する場合、ソース表の暗黙的な隠し列がすべて新規表によって継承されます。 ALTER TABLE ステートメントを使用すると、隠し列を非隠し列に変更したり、非隠し列を隠し列に変更したりできます。 表の一部の列の隠し属性を変更すると、その表を処理しているデータ移動ユーティリティーの動作に影響する可能性があります。 例えば、表を変更して隠し列を定義する前には正常に実行されていたロード操作が、変更後はエラーを返すようになることがあります (SQLCODE -2437)。

exposed-name.* オプションを指定して実行された SELECT 照会の結果表の列を示す名前のリストには、 暗黙的な隠し列は含まれません。 order-by-clause を指定して実行される SELECT 照会は、simple-column-name に暗黙的な非表示列を含めることができます。

マテリアライズ照会表定義で暗黙的な非表示列が明示的に参照される場合、その列はマテリアライズ照会表の一部となります。 ただし、マテリアライズ照会表の列は、暗黙的な隠し列としての属性を継承しません。 これと同じ動作が、as-result-table 節によって作成されるビューと表にも当てはまります。

CREATE INDEX ステートメント、ALTER TABLE ステートメント、または参照制約の中で暗黙的な隠し列を明示的に参照することができます。

暗黙的な隠し列として定義される列には、遷移変数が存在します。 暗黙的な隠し列に対応する遷移変数は、トリガーの本体で参照できます。

暗黙的な隠し列は、作成済み一時表および宣言済み一時表ではサポートされていません。

表の隠し列は、DESCRIBE コマンドを使って表示できます。
DESCRIBE TABLE tablename SHOW DETAIL

  • 例 1: 以下のステートメントでは、暗黙的な隠し列を持つ表が作成されます。
         CREATE TABLE CUSTOMER
         (
          CUSTOMERNO       INTEGER NOT NULL,
          CUSTOMERNAME     VARCHAR(80),
          PHONENO          CHAR(8) IMPLICITLY HIDDEN
         );
    SELECT * は、CUSTOMERNO および CUSTOMERNAME の列の項目のみを返します。 例えば、以下のようにします。
    A123, ACME
    B567, First Choice
    C345, National Chain
    PHONENO 列の項目は、明示的に参照されなければ、隠されます。
    SELECT CUSTOMERNO, CUSTOMERNAME, PHONENO
       FROM CUSTOMER   
  • 例 2: データベース表に暗黙的な隠し列が含まれる場合、隠し列のデータをデータ移動操作に含めるかどうかを指定する必要があります。 以下の例では、LOAD の使用時に、隠し列のデータが含まれるかどうかを示すいくつかの異なる方法を示します。
    • insert-column を使用して、データの挿入先となる列を明示的に指定します。
      db2 load from delfile1 of del
         insert into table1 (c1, c2, c3,...)
    • いずれかの隠し列ファイル・タイプ修飾子を使用します。つまり、入力ファイルに隠し列のデータが含まれる場合は implicitlyhiddeninclude を指定し、入力ファイルに隠し列のデータが含まれない場合は implicitlyhiddenmissing を指定します。
      db2 load from delfile1 of del modified by implicitlyhiddeninclude
         insert into table1 
    • サーバー・サイドで DB2_DMU_DEFAULT レジストリー変数を使用して、データ移動ユーティリティーが暗黙的な隠し列のある表を検出した場合の動作を設定します。
      db2set DB2_DMU_DEFAULT=IMPLICITLYHIDDENINCLUDE
      db2 load from delfile1 of del insert into table1