# DECLARE GLOBAL TEMPORARY TABLE 文

The DECLARE GLOBAL TEMPORARY TABLE statement defines a temporary table for the current connection.

これらの表はシステムカタログにあるものではなく永続的なものではありません。一時表は作成した接続の期間のみ存在して、他の接続から参照することはできません。接続が閉じるとき、 表中の行は削除され、一時表に関するメモリ上の記述は破棄されます。

一時表は以下のような場合に便利です。

- 表の構造がアプリケーションを使う前では分からない場合
- 他のユーザが同様な構造の表を必要としない場合
- アプリケーションを使っている場合のみ、一時表の情報が必要な場合
- システムカタログにロックを持たずに、表の定義と破棄が可能な場合

#### 構文

    DECLARE GLOBAL TEMPORARY TABLE 表名
        { 列定義 [ , 列定義 ] * }
    [ ON COMMIT {DELETE | PRESERVE} ROWS ]
    NOT LOGGED [ON ROLLBACK DELETE ROWS]

#### 表名

一時表の名前です。SESSION以外のスキーマ名が指定された場合、エラーが発生します。(SQLSTATE 428EK) スキーマ名が指定されなかった場合、SESSIONがあてられます。 複数の接続で同じ名前の一時表を作ることができます。なぜならそれぞれの接続は個々に一意な表の記述子を持つからです。

SESSIONを永続的な表のスキーマとして使ってもエラーにはなりませんが推奨しません。 SESSIONというスキーマ名は一時表のスキーマ用に予約されています。

#### 列定義

`列定義`の詳細については列定義の`CREATE TABLE`を参照してください。 `DECLARE GLOBAL TEMPORARY TABLE`では`列定義`に`発番列仕様`は不可能です。

#### データ型

可能なデータ型は以下のとおりです。

- BIGINT
- CHAR
- DATE
- DECIMAL
- DOUBLE
- DOUBLE PRECISION
- FLOAT
- INTEGER
- NUMERIC
- REAL
- SMALLINT
- TIME
- TIMESTAMP
- VARCHAR

#### ON COMMIT

COMMITが行われたときのアクションを指定します。

#### DELETE ROWS

表に開いたカーソルが無ければ、表中の全ての行が削除されます。これはON COMMITの既定です。 もしON ROLLBACK DELETE ROWSを指定した場合は、一時表が使われた場合のみ全ての行が削除されます。 ON COMMIT DELETE ROWSを指定した場合は、一時表が使われなかった場合でも表の行が削除されます(開いたカーソルが無かった場合です。)。

#### PRESERVE ROWS

表の行は留め置かれます。

#### NOT LOGGED

トランザクションがロールバックされたとき、一時表に行われるアクションを指定します。 ROLLBACK(あるいはROLLBACK TO SAVEPOINT)が行われると、作業単位(もしくはセーブポイント)にて表が作られていれば、その表は破棄されます。もし作業単位(もしくはセーブポイント)にて表が破棄された場合、行のない表が復元されます。

#### ON ROLLBACK DELETE ROWS

これはNOT LOGGEDの既定です。NOT LOGGED [ON ROLLBACK DELETE ROWS ]]により、ROLLBACKあるいはROLLBACK TO SAVEPOINTが行われたとき一時表に行われる処理が指定されます。もし表の情報が変更されていれば、全行が削除されます。

#### 例

    set schema myapp;

    create table t1(c11 int, c12 date);

    declare global temporary table SESSION.t1(c11 int) not logged;
    -- 一時表はSESSIONスキーマにしか置かれないので、
    -- SESSIONによる限定は冗長です。
    declare global temporary table t2(c21 int) not logged;
    -- 一時表はSESSIONスキーマにしか置かれないので、
    -- この例ではSESSIONにより限定しません。

    insert into SESSION.t1 values (1);
    -- 現在のスキーマが"myapp."なので、一時表を使うにはSESSIONによる限定が必須です。

    select * from t1;
    -- 表がSESSIONにより限定されていないので、
    -- このselect文の"myapp.t1"は実表を参照します。

注: 一時表はSESSIONスキーマにのみ定義できます。 ユーザはSESSIONという名前の実スキーマを定義するべきではありません。
次のDB2 UDBにて可能なDECLARE GLOBAL TEMPORARY TABLE関数は、Derbyにて使えません。

- IDENTITY column-options
- IDENTITY attribute in copy-options
- AS (fullselect) DEFINITION ONLY
- NOT LOGGED ON ROLLBACK PRESERVE ROWS
- IN tablespace-name
- PARTITIONING KEY
- WITH REPLACE

#### Declared Global Temporary Tablesの制限事項

Derbyでは一時表に次の機能を提供していません。 これらの機能の幾つかは一時表特有のものであり、幾つかはDerby特有のものです。

以下の文では一時表を指定できません。

- ALTER TABLE
- CREATE INDEX
- CREATE SYNONYM
- CREATE TRIGGER
- CREATE VIEW
- GRANT
- LOCK TABLE
- RENAME
- REVOKE

一時表には次の機能を使えません。

- SESSIONスキーマにある表(実表と一時表を含みます)への別名、トリガ、ビュー
- SESSIONスキーマにある表を参照する文のキャッシュ
- 一時表は外部キー制約や主キー制約で指定できない。
- トリガされるSQL文では一時表を参照できません。
- 列のチェック制約
- 発番列仕様
- 一時表へのインポート

一時表への挿入、更新、削除の文にてエラーが起きた場合、一時表の全ての行は削除されます。

一時表にて以下のデータ型は利用できません。

- BLOB
- CHAR FOR BIT DATA
- CLOB
- LONG VARCHAR
- LONG VARCHAR FOR BIT DATA
- VARCHAR FOR BIT DATA
- XML

親トピック: 文