アプリケーション・プロセスの存続時間のみデータを保管する必要があり、ただし表定義は共有したい場合は、作成済みの一時表を使用します。
このタスクについて
Db2は、作成済み一時表のロギング操作とロック操作を実行しません そのため、これらの表を使用する SQL ステートメントは照会を効率的に実行できます。
各アプリケーション処理には、作成済みの一時表のそれ自身のインスタンスがあります。
作成済みの一時表のインスタンスは、
以下のいずれかのアクションが起きるまで、現行サーバーに存在します。
作成済みの一時表の定義は、SQL CREATE GLOBAL TEMPORARY TABLE ステートメントを使用して作成します。
プロシージャー
作成済みの一時表を作成するには、次の手順を実行します。
- CREATE GLOBAL TEMPORARY TABLE ステートメントを発行して、表を定義します。
例えば、次のステートメントは TEMPPRODという表の定義を作成します。
CREATE GLOBAL TEMPORARY TABLE TEMPPROD
(SERIAL CHAR(8) NOT NULL,
DESCRIPTION VARCHAR(60) NOT NULL,
MFGCOST DECIMAL(8,2),
MFGDEPT CHAR(3),
MARKUP SMALLINT,
SALESDEPT CHAR(3),
CURDATE DATE NOT NULL);
LIKE 節を使用して基本表 (名前は PROD) の定義をコピーしても、これと同じ定義を作成できます。
CREATE GLOBAL TEMPORARY TABLE TEMPPROD LIKE PROD;
制限事項 :MERGEステートメントは、作成された一時テーブルでは使用できません。
例のSQLステートメントは、TEMPPROD表に対して同一の定義を作成しますが、これら表はPRODサンプル表PRODとは少し異なります。 PROD サンプル表には DESCRIPTION と CURDATE の 2 つの列があり、これらは NOT NULL WITH DEFAULT として定義されています。 作成済みの一時表は NULL 以外のデフォルト値をサポートしないので、TEMPPROD 表の DESCRIPTION 列と CURDATE 列は NOT NULL として定義され、デフォルトはありません。
2 つの CREATE ステートメントのいずれかを実行した後、TEMPPROD の定義は存在しますが、
表のインスタンスは存在しません。
- 作成した一時表のインスタンスをアプリケーションで作成します。
Db2次のSQLステートメントのいずれかで指定されたときに、表のインスタンスを作成します。
- OPEN
- SELECT
- INSERT
- DELETE
たとえば、前の手順で説明したようにTEMPRODを定義してから、次のステートメントを含むアプリケーションを実行するとします。
EXEC SQL DECLARE C1 CURSOR FOR SELECT * FROM TEMPPROD;
EXEC SQL INSERT INTO TEMPPROD SELECT * FROM PROD;
EXEC SQL OPEN C1;
⋮
EXEC SQL COMMIT;
⋮
EXEC SQL CLOSE C1;
INSERTステートメントを実行すると、
Db2TEMPPRODのインスタンスが作成され、そのインスタンスに表PRODの行が入力されます。 COMMIT ステートメントが実行されると、
Db2は TEMPPRODからすべての行を削除します。 しかし、カーソル C1 の宣言を次の宣言に変更することを前提とします。
EXEC SQL DECLARE C1 CURSOR WITH HOLD
FOR SELECT * FROM TEMPPROD;
この場合、COMMITステートメントの実行時にWITH HOLD節に定義されたカーソルであるC1が開いているため、
Db2アプリケーションが終了するまでTEMPPRODの内容を削除しないでください。 いずれの場合も、
Db2は、アプリケーションが終了したときに TEMPPROD のインスタンスをドロップします。
- 表が必要なくなったら、DROPステートメントを発行します。
例えば、TEMPPRODの定義をドロップするには、以下のステートメントを実行しなければなりません。
DROP TABLE TEMPPROD;