global temporary table (一時表)が便利
Oracle に用意されている global temporary table は、セッションやトランザクションの終了時にテーブル内のデータが自動的に削除される便利機能でワークテーブルとしてちょいちょい使用しています。例えば、印刷用のデータを突っ込んだりしています。
global temporary table の作成
global temporary table は、データが削除されるタイミングに2種類の方法が用意されています。1つは、トランザクション終了時、もう一つはセッション終了時にテーブル内の全てのデータが削除されます。 テーブルの作成には、次のように create global temporary table 文を使用しデータの削除方法を指定します。
create global temporary table テーブル名 (
項目名 型
,項目名 型
,...)
データの削除方法;
データの削除方法は、次のいずれかを指定します。
- on commit delete rows:トランザクション終了時にデータを削除する
- on commit preserve rows:セッション終了時にデータを削除する
簡単な例で示すと次のように作成します。
SQL> create global temporary table test(
col1 number,
col2 number)
on commit delete rows;
表が作成されました。
どのような動きをするか確認してみる( on commit delete rows )
トランザクション終了時にデータが削除されることを確認します。
SQL> insert into test values(13, 10);
1行が作成されました。
SQL> insert into test values(24, 20);
1行が作成されました。
SQL> select * from test;
COL1 COL2
---------- ----------
13 10
24 20
SQL> commit;
コミットが完了しました。
SQL> select * from test;
レコードが選択されませんでした。
コミットしているのにデータが取得できないことから、削除されていることが確認できます。
どのような動きをするか確認してみる( on commit preserve rows )
on commit preserve rows を指定してテーブルを作成しておきます。
セッション終了時にデータが削除されることを確認します。
SQL> insert into test values(13, 10);
1行が作成されました。
SQL> insert into test values(24, 20);
1行が作成されました。
SQL> commit;
コミットが完了しました。
SQL> select * from test;
COL1 COL2
---------- ----------
13 10
24 20
SQL> exit
別セッションで接続して確認します。
SQL> select * from test;
レコードが選択されませんでした。
コミットしているのにデータが取得できないことから、削除されていることが確認できます。