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というスキーマ名は一時表のスキーマ用に予約されています。
表に開いたカーソルが無ければ、表中の全ての行が削除されます。これはON COMMITの既定です。 もしON ROLLBACK DELETE ROWSを指定した場合は、一時表が使われた場合のみ全ての行が削除されます。 ON COMMIT DELETE ROWSを指定した場合は、一時表が使われなかった場合でも表の行が削除されます(開いたカーソルが無かった場合です。)。
表の行は留め置かれます。
トランザクションがロールバックされたとき、一時表に行われるアクションを指定します。 ROLLBACK(あるいはROLLBACK TO SAVEPOINT)が行われると、作業単位(もしくはセーブポイント)にて表が作られていれば、その表は破棄されます。もし作業単位(もしくはセーブポイント)にて表が破棄された場合、行のない表が復元されます。
これは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"は実表を参照します。
Derbyでは一時表に次の機能を提供していません。 これらの機能の幾つかは一時表特有のものであり、幾つかはDerby特有のものです。
一時表には次の機能を使えません。
一時表への挿入、更新、削除の文にてエラーが起きた場合、一時表の全ての行は削除されます。