アプリケーション・プロセスの存続時間のみデータを保管する必要があり、表定義を共有する必要がない場合は、宣言済み一時表を使用します。 この表の定義は、アプリケーション・プロセスの実行中のみ存在します。 Db2 宣言された一時テーブルに対して、限定的なログ記録とロック操作を実行します。
始める前に
宣言済み一時表を定義するには、32 KB ページ・サイズの表スペースを少なくとも 1 つ含む WORKFILE データベースがあらかじめ必要です。
このタスクについて
宣言済み一時表のインスタンスは、SQL DECLARE GLOBAL TEMPORARY TABLE ステートメントを使用して作成します。 このインスタンスは、この表を宣言した
アプリケーション・プロセスにだけ既知であり、したがって、異なるアプリケーションでは、
これと同じ名前を持つ一時表を宣言することができます。 宣言済み一時表の修飾子は SESSION です。
宣言済み一時表を作成するには、DECLARE GLOBAL TEMPORARY TABLE ステートメントを指定します。 そのステートメント内で、次のいずれかの処置を行って、表に含める列を指定します。
プロシージャー
宣言済み一時表を作成するには、次の手順で行います。
- DECLARE GLOBAL TEMPORARY TABLE ステートメントを発行します。
そのステートメントでは、次のいずれかのアクションを実行して、表に含める列を指定します。
- 表内のすべての列を指定する。 たとえば、次のステートメントは、列を明示的に指定することにより、TEMPPRODと呼ばれる宣言された一時表を定義します。
DECLARE GLOBAL TEMPORARY TABLE TEMPPROD
(SERIAL CHAR(8) NOT NULL WITH DEFAULT '99999999',
DESCRIPTION VARCHAR(60) NOT NULL,
PRODCOUNT INTEGER GENERATED ALWAYS AS IDENTITY,
MFGCOST DECIMAL(8,2),
MFGDEPT CHAR(3),
MARKUP SMALLINT,
SALESDEPT CHAR(3),
CURDATE DATE NOT NULL);
作成済みの一時表の列と異なり、
宣言済み一時表の列には WITH DEFAULT 文節を組み込むことができます。
- LIKE 文節を使用して、基本表、作成済みの一時表、
またはビューの定義をコピーする。 たとえば、次のステートメントは、ベース表の定義をコピーすることにより、TEMPPRODと呼ばれる宣言された一時表を定義します。 基本表には、
宣言済み一時表も ID 列として使用する ID 列があります。
DECLARE GLOBAL TEMPORARY TABLE TEMPPROD LIKE BASEPROD
INCLUDING IDENTITY COLUMN ATTRIBUTES;
- 列を照会する元となる基本表、作成済みの一時表、
またはビューに ID 列がある場合は、
宣言済み一時表の対応する列も ID 列であることを指定できます。 これらの ID 列を組み込むには、宣言済み一時表を定義する際に INCLUDING IDENTITY COLUMN ATTRIBUTES 文節を指定します。
ソース表に行変更タイム・スタンプ列がある場合は、INCLUDING ROW CHANGE TIMESTAMP COLUMN ATTRIBUTES を指定することによって、これらの列属性を宣言済み一時表内で継承するように指示できます。
- 全選択を使用して、
基本表、作成済みの一時表、またはビューから特定の列を選択する。 たとえば、次のステートメントは、ビューから列を選択することにより、TEMPPRODと呼ばれる宣言された一時表を定義します。 ビューには、
宣言済み一時表も ID 列として使用する ID 列があります。 宣言済み一時表は、そのデフォルト列値を、ビューの基礎となる基本表のデフォルト列値から継承します。
DECLARE GLOBAL TEMPORARY TABLE TEMPPROD
AS (SELECT * FROM PRODVIEW)
DEFINITION ONLY
INCLUDING IDENTITY COLUMN ATTRIBUTES
INCLUDING COLUMN DEFAULTS;
宣言済み一時表の列に、全選択で指定した表またはビューの列のデフォルトを
継承させる場合は、INCLUDING COLUMN DEFAULT 文節を指定します。 宣言済み一時表の列にそのデータ・タイプに対応するデフォルト値を持たせる
場合は、USING TYPE DEFAULT 文節を指定します。
Db2 は宣言済み一時表の空のインスタンスを作成します。
- 以下のいずれかの処置を実行します。
- INSERT文を使用して、宣言した一時テーブルにデータを入力します。
- 検索または位置指定されたUPDATEまたはDELETE文を使用してテーブルを変更します。
- SELECT文を使用してテーブルに問い合わせる。
- 宣言された一時テーブルにインデックスを作成します。 作業ファイルデータベースのデフォルトのインデックスバッファプールまたはデフォルトのストレージグループとは異なるバッファプールまたはストレージグループを指定するインデックスを作成するには、バッファプールまたはストレージグループに対する追加のUSE権限が必要です。
- DECLARE GLOBAL TEMPORARY TABLE ステートメントの実行後、
宣言済み一時表の定義は、
そのアプリケーション・プロセスが実行されている間は存在します。 申請プロセスが完了する前に定義を削除する必要がある場合は、DROPTABLEステートメントを発行してください。
例えば、TEMPPROD の定義をドロップするには、
次のステートメントを実行します。
DROP TABLE SESSION.TEMPPROD;
例
DECLARE GLOBAL TEMPORARYTABLEステートメントで指定するONCOMMIT節は、一時表が宣言されているアプリケーションでCOMMITステートメントを実行するときに、Db2表からすべての行を保持するか削除するかを決定します。 デフォルトは ON COMMIT DELETE ROWS ですが、この場合は、保留カーソルが
コミット時点で表でオープンされない限り、コミット時点で
表のすべての行を削除します。 ON COMMIT PRESERVE ROWS の指定があれば、
行はコミット時点を超えて保持されます。
例えば、アプリケーション・プログラムの以下のステートメントを実行するとします。
EXEC SQL DECLARE GLOBAL TEMPORARY TABLE TEMPPROD
AS (SELECT * FROM BASEPROD)
DEFINITION ONLY
INCLUDING IDENTITY COLUMN ATTRIBUTES
INCLUDING COLUMN DEFAULTS
ON COMMIT PRESERVE ROWS;
EXEC SQL INSERT INTO SESSION.TEMPPROD SELECT * FROM BASEPROD;
⋮
EXEC SQL COMMIT;
⋮
Db2上記のDECLAREGLOBAL TEMPORARY TABLEステートメントを実行すると、Db2TEMPPRODの空のインスタンスが作成されます。 INSERT ステートメントが、
表 BASEPROD からの行でそのインスタンスに埋め込みを行います。 TEMPPROD を
参照するステートメントにはすべて、SESSION と
いう修飾子が必要です。 Db2COMMITステートメントを実行すると、Db2TEMPPRODはON COMMIT PRESERVE ROWSで定義されているため、すべての行をTEMPPRODに保持します。 プログラムが終了すると、Db2 はTEMPPRODをドロップします。