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;

レコードが選択されませんでした。

コミットしているのにデータが取得できないことから、削除されていることが確認できます。