表列が暗黙的な隠し属性によって定義されると、明示的に参照されなければ、その列は使用できません。 例えば、表に対して 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 TABLE tablename SHOW DETAIL
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
db2 load from delfile1 of del
insert into table1 (c1, c2, c3,...)
db2 load from delfile1 of del modified by implicitlyhiddeninclude
insert into table1
db2set DB2_DMU_DEFAULT=IMPLICITLYHIDDENINCLUDE
db2 load from delfile1 of del insert into table1