LoginSignup
5
9

More than 5 years have passed since last update.

PRIVATE TEMPORARY TABLEを試す(Oracle Database 18c)

Last updated at Posted at 2018-08-03

Oracle Database 18c に搭載された PRIVATE TEMPORARY TABLE の機能を試しました。

PRIVATE TEMPORARY TABLE とは

PRIVATE TEMPORARY TABLE はセッションの間だけ維持される一時テーブルです。従来はレコードのみが一時的でテーブル定義が永続化される GLOBAL TEMPORARY TABLE しかありませんでした。
PRIVATE TEMPORARY TABLE は、トランザクションの間だけ維持されるか、セッションの間だけ維持されるかを選択することができます。

作成方法

CREATE PRIVATE TEMPORARY TABLE 文を実行します。

SQL> CREATE PRIVATE TEMPORARY TABLE ORA$PTT_TEMP1 (c1 NUMBER, c2 VARCHAR2(10))
  2  ON COMMIT PRESERVE DEFINITION;

Table created.

テーブル名の先頭の「ORA$PTT_」は、初期化パラメーター private_temp_table_prefix のデフォルト値です。PRIVATE TEMPORARY TABLE を作成する場合には、テーブル名の先頭にこのパラメーター値を指定する必要があります。
この初期化パラメーターはセッション単位では変更できません。テーブル名が指定された名前ではない場合、エラー「ORA-903: invalid table name」が発生します。

SQL> SHOW PARAMETER PRIVATE_TEMP_TABLE_PREFIX;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
private_temp_table_prefix            string      ORA$PTT_

SQL> CREATE PRIVATE TEMPORARY TABLE TEMP1 (c1 NUMBER, c2 VARCHAR2(10))
  2  ON COMMIT PRESERVE DEFINITION;
CREATE PRIVATE TEMPORARY TABLE TEMP1 (c1 NUMBER, c2 VARCHAR2(10))
*
ERROR at line 1:
ORA-00903: invalid table name

ON COMMIT PRESERVE DEFINITION 句は、トランザクション完了後もテーブル定義を維持する指定です。トランザクション完了と同時にテーブルを削除する場合は ON COMMIT DROP DEFINITION 句を指定します。
GLOBAL TEMPORARY TABLE には、ON COMMIT DELETE ROWS 句と ON COMMIT PRESERVE ROWS 句を指定できますが、PRIVATE TEMPORARY TABLE の作成時に ON COMMIT PRESERVE DEFINITION 句を指定した場合、トランザクションの完了後もレコードは維持されます(ON COMMIT PRESERVE ROWS と同じ動作)。

制約

マニュアルには記述がまったくありませんが、 ORACLE-BASE の記事を読むと、
PRIVATE TEMPORARY TABLE には以下の制約があります。

  1. テーブル名は、初期化パラメーター private_temp_table_prefix で始まる名前で作成する必要がある(前述の通り)
  2. 永続化オブジェクトは一時オブジェクトを参照できない(VIEW 定義等のことか?)
  3. インデックス、マテリアライズド・ビュー、ゾーンマップは作成できない
  4. 列のデフォルト値を定義できない
  5. データベース・リンクではアクセスできない

インデックスが作成できないので、主キー制約も作成できません。使用できない機能を指定された場合、エラー「ORA-14451: unsupported feature with temporary table」が発生します。

SQL> CREATE PRIVATE TEMPORARY TABLE ORA$PTT_TEMP1 (c1 NUMBER PRIMARY KEY, c2 VARCHAR2(10))
  2  ON COMMIT PRESERVE DEFINITION;
CREATE PRIVATE TEMPORARY TABLE ORA$PTT_TEMP1 (c1 NUMBER PRIMARY KEY, c2 VARCHAR2(10))
                                                                   *
ERROR at line 1:
ORA-14451: unsupported feature with temporary table

PRIVATE TEMPORARY TABLE は、USER_TABLES ビューには格納されません。

SQL> DESCRIBE ORA$PTT_TEMP1;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 C1                                                 NUMBER
 C2                                                 VARCHAR2(10)

SQL> SELECT TABLE_NAME FROM USER_TABLES WHERE TABLE_NAME='ORA$PTT_TEMP1';

no rows selected

SQL>

また、初期化パラメーター private_temp_table_prefix から始まる通常のテーブルは作成できません。

SQL> CREATE TABLE ORA$PTT_TEMP2(c1 NUMBER, c2 VARCHAR2(10)) ;
CREATE TABLE ORA$PTT_TEMP2(c1 NUMBER, c2 VARCHAR2(10))
*
ERROR at line 1:
ORA-32463: cannot create an object with a name matching private temporary table
prefix

5
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
9