CREATE GLOBAL TEMPORARY TABLE ステートメント
CREATE GLOBAL TEMPORARY TABLE ステートメントは、現行のサーバー上に一時表の記述を作成します。作成済み一時表を参照する各セッションは、それぞれのセッション内で挿入された行のみを取得します。セッションが終了すると、そのセッションに関連する行は表から削除されます。
呼び出し
このステートメントは、アプリケーション・プログラムに組み込んだり、動的 SQL ステートメントを使用して発行したりすることができます。 これは、DYNAMICRULES の実行動作がパッケージに効力を持つ場合にのみ、動的に準備できる実行可能ステートメントです (SQLSTATE 42509)。
許可
- 以下の特権および権限のいずれか:
- 表スペースでの USE 特権
- SYSADM
- SYSCTRL
- 加えて、以下の特権および権限のいずれか:
- データベースに対する IMPLICIT_SCHEMA 権限 (表の暗黙的または 明示的スキーマ名が存在しない場合)
- スキーマに対する CREATEIN 特権 (表のスキーマ名が既存のスキーマを指す場合)
- スキーマに対する SCHEMAADM 権限 (表のスキーマ名が既存のスキーマを指している場合)
- その表またはビューに対する SELECT 特権
- 表またはビューに対する CONTROL 特権
- 表またはビューが含まれるスキーマに対する SELECTIN 特権
- 表またはビューが含まれるスキーマに対するスキーマ DATAACCESS 権限
- DATAACCESS 権限
構文
説明
- table-name
- 表の名前を指定します。 暗黙または明示の修飾子を含む名前は、カタログに記述されている表、ビュー、ニックネーム、または別名を指定するものであってはなりません。 2 つの部分からなる名前を指定する場合、「SYS」で始まるスキーマ名は使用できません (SQLSTATE 42939)。
- column-definition
- 一時表の列の属性を定義します。
- column-name
- 表を構成する列の名前を指定します。
名前を修飾したり、表の複数の列に対して同じ名前を使用することはできません (SQLSTATE 42711)。
A 表には、以下のものを指定できます。
- 4K ページ・サイズの場合、最大 500 列。 列のバイト・カウントは 4 005 を超えてはなりません。
- 8K ページ・サイズの場合、最大 1 012 列。 列のバイト・カウントは 8 101 を超えてはなりません。
- 16K ページ・サイズの場合、最大 1 012 列。 列のバイト・カウントは 16 293 を超えてはなりません。
- 32K ページ・サイズの場合、最大 1 012 列。 列のバイト・カウントは 32 677 を超えてはなりません。
作成済み一時表には、行開始列、行終了列、トランザクション開始 ID 列のいずれも含めることができません。
詳細については、『CREATE TABLE ステートメント』の『行サイズ』を参照してください。
- data-type
- 列のデータ・タイプを指定します。
- built-in-type
- 組み込みデータ・タイプを指定します。built-in-type の説明については、『CREATE TABLE』を参照してください。
作成済み一時表に XML および SYSPROC.Db2SECURITYLABEL データ・タイプを指定することはできません。
- distinct-type-name
- ユーザー定義タイプの中で特殊タイプであるものを示します。
スキーマ名を伴わない特殊タイプ名を指定した場合、
その特殊タイプ名は SQL パスのスキーマから探索することによって解決されます (このパスは、
静的 SQL の場合は FUNCPATH プリプロセス・オプションによって、
動的 SQL の場合は CURRENT PATH レジスターによって定義されます)。
特殊タイプを使用して列を定義する場合、 その列のデータ・タイプはその特殊タイプになります。 列の長さと位取りは、それぞれ特殊タイプのソース・タイプの長さと位取りになります。 列の特殊タイプは、データ・タイプ制約を持つことができず、ソース・タイプは、アンカー・データ・タイプにすることができません (SQLSTATE 428H2)。
- column-options
- 表の列に関連した追加オプションを定義します。
- NOT NULL
- 列に NULL 値が入るのを防止します。NULL 値の指定については、『CREATE TABLE』の NOT NULL を参照してください。
- default-clause
- 列のデフォルト値を指定します。
- WITH
- オプション・キーワード。
- DEFAULT
- INSERT で値が提供されなかった場合、
もしくは INSERT や UPDATE で DEFAULT が指定されている場合に、
デフォルト値を提供します。
DEFAULT キーワードの後にデフォルト値が指定されていない場合、
使用されるデフォルト値は列のデータ・タイプによって異なります。
『ALTER TABLE』を参照してください。
列が型付き表の列に基づいている場合、 デフォルト値の定義時には特定のデフォルト値を指定する必要があります。 型付き表のオブジェクト ID の列には、 デフォルト値を指定することはできません (SQLSTATE 42997)。
列が特殊タイプを使用して定義される場合、列のデフォルト値は、 特殊タイプにキャストされたソース・データ・タイプのデフォルト値になります。
構造化タイプを使用して列を定義する場合は、 default-clause を指定できません (SQLSTATE 42842)。
column-definition から DEFAULT を省略すると、 その列のデフォルト値として NULL 値が使用されます。 そのような列を NOT NULL と定義すると、その列には有効なデフォルトはなくなります。
- default-values
- default-values に指定できるデフォルト値のタイプは、以下のとおりです。
- constant
- 列のデフォルト値として定数を指定します。
指定する定数は、次の条件を満たしていなければなりません。
- 割り当ての規則に従って、 その列に割り当てることができる値でなければなりません。
- その列が浮動小数点数データ・タイプとして定義されている場合を除き、浮動小数点の定数を指定してはなりません。
- 列のデータ・タイプが 10 進浮動小数点数の場合は、数値定数または 10 進浮動小数点特殊値でなければなりません。 浮動小数点定数はまず DOUBLE として解釈され、次にターゲット列が DECFLOAT である場合は 10 進浮動小数点数に変換されます。 DECFLOAT(16) 列では、16 桁を超える精度を持つ 10 進定数は、CURRENT DECFLOAT ROUNDING MODE 特殊レジスターにより指定される丸めモードを使用して丸められます。
- 定数が 10 進定数の場合、 その列のデータ・タイプの位取りを超えるゼロ以外の数字を含めてはなりません (例えば、 DECIMAL(5,2) の列のデフォルト値として 1.234 を指定することはできません)。
- 指定する定数が 254 バイトを超えてはなりません。この制約には、 引用符文字や 16 進定数の X などの接頭部文字も含まれます。さらに、 定数が cast-function の引数の場合には、 完全修飾された関数名から取った文字や括弧も含めて、この制限を超えてはなりません。
- datetime-special-register
- INSERT、UPDATE、または LOAD の実行時における日時特殊レジスターの値 (CURRENT DATE、 CURRENT TIME、または CURRENT TIMESTAMP) を、その列のデフォルト値として指定します。 その列のデータ・タイプは、 指定した特殊レジスターに対応するデータ・タイプでなければなりません (例えば、 CURRENT DATE を指定した場合、データ・タイプは DATE でなければなりません)。
- user-special-register
- INSERT、UPDATE、または LOAD の実行時におけるユーザー特殊レジスターの値 (CURRENT USER、 SESSION_USER、SYSTEM_USER) を、その列のデフォルトとして指定します。 その列のデータ・タイプは、 ユーザー特殊レジスターの長さ属性よりも短い文字ストリングであってはなりません。 なお、SESSION_USER の代わりに USER を、 CURRENT USER の代わりに CURRENT_USER を指定することもできます。
- CURRENT SCHEMA
- INSERT、UPDATE、または LOAD の実行時における CURRENT SCHEMA 特殊レジスターの値を、 その列のデフォルト値として指定します。 CURRENT SCHEMA を指定した場合、その列のデータ・タイプは、 CURRENT SCHEMA 特殊レジスターの長さ属性よりも短い文字ストリングであってはなりません。
- NULL
- その列のデフォルト値として NULL を指定します。 NOT NULL が指定された場合は、DEFAULT NULL を同じ列定義に指定できますが、その列をデフォルト値に設定しようとするとエラーが生じます。
- cast-function
- この形式のデフォルト値は、特殊タイプ (distinct type)、
BLOB、または日時 (DATE、TIME、
または TIMESTAMP) データ・タイプとして定義された列に対してのみ使用することができます。
特殊タイプで、BLOB や日時タイプに基づいている場合以外は、
関数名が列の特殊タイプの名前に一致していなければなりません。
スキーマ名で修飾されている場合には、
その特殊タイプのスキーマ名と同じでなければなりません。
修飾されていない場合には、
関数の解決で得られるスキーマ名は特殊タイプのスキーマ名と同じでなければなりません。
日時タイプに基づく特殊タイプで、デフォルト値が定数の場合、
必ず関数を使用する必要があります。さらに、その関数名は、
暗黙または明示のスキーマ名 SYSIBM を持つ特殊タイプのソース・タイプ名に一致していなければなりません。
他の日時列の場合は、対応する日時関数も使用できます。
BLOB または、BLOB に基づく特殊タイプの場合も、関数を使用する必要があります。
その関数名は、暗黙または明示のスキーマ名 SYSIBM を持つ BLOB でなければなりません。
- constant
- 引数として定数を指定します。 指定する定数は、 特殊タイプのソース・タイプに関する定数の規則 (特殊タイプでない場合は、 データ・タイプに関する定数の規則) に従っていなければなりません。 cast-function が BLOB の場合には、 定数としてストリング定数を指定する必要があります。
- datetime-special-register
- CURRENT DATE、CURRENT TIME、または CURRENT TIMESTAMP を指定します。 列の特殊タイプのソース・タイプは、 指定した特殊レジスターに対応するデータ・タイプでなければなりません。
- user-special-register
- CURRENT USER、SESSION_USER、または SYSTEM_USER を指定します。 列の特殊タイプのソース・タイプのデータ・タイプは、 少なくとも 8 バイトの長さのストリング・データ・タイプでなければなりません。 cast-function が BLOB の場合には、 長さ属性が 8 バイト以上でなければなりません。
- CURRENT SCHEMA
- CURRENT SCHEMA 特殊レジスターの値を指定します。 列の特殊タイプのソース・タイプのデータ・タイプは、CURRENT SCHEMA 特殊レジスターの長さ属性よりも短い文字ストリングであってはなりません。 cast-function が BLOB の場合には、長さ属性が 8 バイト以上でなければなりません。
- EMPTY_CLOB()、EMPTY_DBCLOB()、または EMPTY_BLOB()
- その列のデフォルト値として長さゼロのストリングを指定します。 その列は、この関数の結果データ・タイプに対応するデータ・タイプを持っている必要があります。
指定した値が無効な場合、エラーが戻されます (SQLSTATE 42894)。
- IDENTITY および identity-options
- ID 列の指定については、『CREATE TABLE』の IDENTITY および identity-options を参照してください。
- LIKE table-name1 または view-name または nickname
- 表の列の名前と記述が、指定された表 (table-name1)、ビュー (view-name)、
またはニックネーム (nickname) の列とまったく同じであることを指定します。LIKE の後に指定する名前は、カタログに存在する表、ビューまたはニックネーム、
あるいは宣言済み一時表を識別するものでなければなりません。
型付き表または型付きビューを指定することはできません (SQLSTATE 428EC)。
保護された表を指定することはできません (SQLSTATE 42962)。IMPLICITLY HIDDEN として定義された列を含む表を指定することはできません (SQLSTATE 560AE)。
LIKE を使用すると、n 列が暗黙的に定義されます。n は、指定した表、ビューまたはニックネームにおける列数です (指定した表では暗黙的な隠し列を含む)。暗黙的な定義は、LIKE の後に指定されるものによって決まります。
- 表が特定されると、暗黙的な定義には table-name1 のそれぞれの列の列名、 データ・タイプ、および NULL 可能特性が入ります。 EXCLUDING COLUMN DEFAULTS を指定しないと、列のデフォルト値も入ります。
- ビューが特定されると、 暗黙的な定義には view-name に指定した全選択のそれぞれの結果列の列名、 データ・タイプ、および NULL 可能特性が入ります。ビュー列のデータ・タイプは、表の列に対して有効なデータ・タイプでなければなりません。
- ニックネームが特定されると、暗黙的な定義には nickname のそれぞれの列の列名、 データ・タイプ、および NULL 可能特性が入ります。
copy-attributes 節に基づいて、列のデフォルトと ID 列属性を組み込んだり除外したりすることができます。さらにこの暗黙的な定義には、指定した表、ビュー、またはニックネームの他の属性は含まれません。したがって、新しい表にはユニーク制約、外部キー制約、トリガー、索引、表パーティション・キー、または分散キーはありません。表は IN 節で暗黙的にまたは明示的に指定した表スペースの中に作成されます。 また、任意指定の他の節を指定した場合に限り、この表にその任意指定の節が含まれます。
表が LIKE 節内で定義されていて、その表に ROW CHANGE TIMESTAMP 列が含まれている場合、新規表の対応する列は ROW CHANGE TIMESTAMP 列のデータ・タイプのみを継承します。新規列は生成列とは見なされません。
table-name1 において行レベルまたは列レベルのアクセス制御 (RCAC) が実施されている場合、新しい表に RCAC は継承されません。
- AS (fullselect) WITH NO DATA
- 表の列の名前と記述が、全選択を実行した場合に全選択の派生結果表に現れる列と同じになるよう指定します。
AS (fullselect) は、作成済み一時表に対する n 列の暗黙的な定義で使用されます。n は、全選択の結果として得られる列の数を表します。
暗黙的な定義には、n 列の以下の属性が含まれます (データ・タイプに該当する場合):
- 列名
- データ・タイプ、長さ、精度、および位取り
- NULL 可能
以下の属性は含まれません (デフォルト値および識別属性は、copy-options を使用して含めることができます):- デフォルト値
- 識別属性
- 非表示属性
- ROW CHANGE TIMESTAMP
全選択で参照される表やビューの他のオプションの属性は、暗黙的な定義には含まれません。
選択リストの各エレメントの名前は、それぞれユニークなものでなければなりません (SQLSTATE 42711)。 SELECT 節で AS 節を使用すると、それぞれのエレメントにユニークな名前を付けることができます。 全選択が、ホスト変数を参照したり、パラメーター・マーカーを含んでいたりしてはなりません。 全選択の結果列のデータ・タイプは、表の列に対して有効なデータ・タイプでなければなりません。
fullselect で指定した表において行レベルまたは列レベルのアクセス制御 (RCAC) が実施されている場合、新しい表に RCAC はカスケードされません。
- copy-options
- これらのオプションでは、
ソースの結果表定義 (表、ビュー、または全選択) から付加的な属性をコピーするかどうかを指定します。
- INCLUDING COLUMN DEFAULTS
- ソース結果表の定義の更新可能な各列の列デフォルトをコピーします。
更新可能でない列では、作成される表の対応列にデフォルトが定義されないことになります。
LIKE table-name1 が指定されており、かつ table-name1 が基本表、作成済み一時表、または宣言済み一時表である場合に限り、この INCLUDING COLUMN DEFAULTS がデフォルトとして使用されます。
- EXCLUDING COLUMN DEFAULTS
- 列のデフォルトは、ソースの結果表定義からコピーされません。
この節がデフォルトです。ただし、LIKE table-name が指定され、かつ table-name が基本表、作成済み一時表、または宣言済み一時表を示す場合を除きます。
- INCLUDING IDENTITY COLUMN ATTRIBUTES
- この節を使用すると、
ソースの結果表定義から ID 列の属性 (START WITH、INCREMENT BY、および CACHE の値) がコピーされます。
これらの属性をコピーできるのは、表、ビュー、または全選択内の対応する列のエレメントが、ID のプロパティーが含まれている基本表、または作成済み一時表の列名に直接または間接的にマップされた表の列の名前、またはビューの列の名前である場合です。
これ以外の場合は、新しい一時表の列に ID のプロパティーは定義されません。
以下に例を示します。
- 全選択の選択リストに ID 列の名前のインスタンスが複数含まれている (つまり、 同じ列を複数回選択している) 場合
- 全選択の選択リストに複数の ID 列が含まれている (つまり、結合が関与している) 場合
- ID 列が選択リスト内の式に組み込まれている場合
- 全選択にセット演算 (UNION (合併)、EXCEPT (差)、または INTERSECT (論理積)) が含まれている場合
- EXCLUDING IDENTITY COLUMN ATTRIBUTES
- ソース結果表の定義から ID 列属性はコピーされません。
- ON COMMIT
- COMMIT 操作の実行時に作成済み一時表で行うアクションを指定します。
デフォルトは DELETE ROWS です。
- DELETE ROWS
- 表にオープンされている WITH HOLD カーソルがなければ、すべての行が表から削除されます。
- PRESERVE ROWS
- 表の行が保存されます。
- LOGGED または NOT LOGGED
- 表に対する操作をログに記録するかどうかを指定します。
デフォルトは NOT LOGGED ON ROLLBACK DELETE ROWS です。
- NOT LOGGED
- 表に対する挿入、更新、または削除操作をログに記録せず、表の作成またはドロップをログに記録するよう指定します。
ROLLBACK (または ROLLBACK TO SAVEPOINT) 操作中に:
- 表が作業単位 (またはセーブポイント) 内で作成された場合、表はドロップされます。
- 表が作業単位 (またはセーブポイント) 内でドロップされた場合、表は再作成されますが、データは消失します。
- ON ROLLBACK
- ROLLBACK (または ROLLBACK TO SAVEPOINT) 操作が実行されるときに、ログに記録されていない作成済み一時表に対して取られるアクションを指定します。
デフォルトは DELETE ROWS です。
- DELETE ROWS
- 表データが変更されている場合は、すべての行が削除されます。
- PRESERVE ROWS
- 表の行が保存されます。
- LOGGED
- 表の作成またはドロップだけではなく、表に対する挿入、更新、または削除操作をログに記録するよう指定します。
- IN tablespace-name
- 作成済み一時表をインスタンス化する表スペースを指定します。
ここでは、既存の USER TEMPORARY 表スペースを指定する必要があります (SQLSTATE 42838)。
また、ステートメントの許可 ID にはその表スペースに対する USE 特権が含まれていなければなりません (SQLSTATE 42501)。
この節が指定されない場合、
表をインスタンス化する表スペースは USER TEMPORARY 表スペースの中から選択され、
その中のステートメントの許可 ID に USE 特権が含まれている表スペースで、
かつ必要なページ・サイズに最も適したサイズの表スペースが使用されます。
複数の表スペースがそれにあてはまる場合、
以下のどれに USE 特権が付与されているかに応じて優先順位が決められます。
- 許可 ID
- 許可 ID を保有するグループ
- PUBLIC
表スペースの決定は、以下の時点で変更することができます。- 表スペースをドロップまたは作成するとき
- USE 特権を付与または取り消すとき
- distribution-clause
- データベース・パーティションの方式、つまり複数のデータベース・パーティションにデータを配分させる方法を指定します。
- DISTRIBUTE BY HASH (column-name,...)
- 複数のデータベース・パーティションにデータを分散させる方式として、分散キー という指定の列でデフォルトのハッシュ機能を使用する方式を指定します。
column-name は、表の列を指定する非修飾名でなければなりません (SQLSTATE 42703)。
同じ列を複数回指定することはできません (SQLSTATE 42709)。
データ・タイプが BLOB、CLOB、DBCLOB、XML、またはこれらのタイプのいずれかに基づく特殊タイプ、構造化タイプの列は、分散キーの一部として使用できません (SQLSTATE 42962)。
この節が指定されておらず、この表が複数データベース・パーティションの複数パーティション・データベース・パーティション・グループに存在する場合、 デフォルトの分散キーが自動的に定義されます。
デフォルトの分散キーの要件を満たす列が存在しない場合は、分散キーなしで表が作成されます。 このような表は、単一パーティションのデータベース・パーティション・グループに対して定義された表スペースでのみ認められています。
単一パーティションのデータベース・パーティション・グループに対して定義された表スペースの表の場合は、分散キーとして有効なデータ・タイプの任意の列の集合を分散キーの定義に使用できます。 この節の指定がない場合、分散キーは作成されません。
注
- USER TEMPORARY 表スペースは、作成済みの一時表が作成される前に、存在しなくてはなりません (SQLSTATE 42727)。
- 作成済み一時表には、データ行圧縮が使用可能です。パフォーマンスに効果があるとデータベース・マネージャーが判断した場合は、基本表のオブジェクトにインラインで XML 文書を保管する表の行データが圧縮されます。ただし、作成済み一時表の XML ストレージ・オブジェクトのデータ圧縮はサポートされていません。
- 作成済み一時表に作成される索引には、デフォルトで索引圧縮が使用可能になります。圧縮はオンとして示されますが、適切なライセンス (IBM Db2® Storage Optimization Feature) が適用されていなければ索引は圧縮されません。
- インスタンス化と終了: 以下の説明において、それぞれ P はセッションを、T はセッション P の中の作成済み一時表を示しています。
- T の空のインスタンスは、P で実行される最初の T の参照の結果として作成されます。
- P で実行されるすべての SQL ステートメントでは T を参照することができます。 そして、P で T を参照する場合は、すべてその同じインスタンスが参照されます。
- ON COMMIT DELETE ROWS 節が暗黙的または明示的に指定された場合は、P においてコミット操作が作業単位で終了し、T に属する WITH HOLD カーソルが 1 つも P にオープンされていない状態になると、操作 DELETE FROM T がコミットに組み込まれます。
- P において、作業単位またはセーブポイントでロールバック操作が終了し、その作業単位またはセーブポイントに T への変更が含まれている場合、次のようになります。
- NOT LOGGED が指定されていた場合は、ON ROLLBACK PRESERVE ROWS も指定されていた場合を除き、T の行はすべて削除されます。
- NOT LOGGED が指定されていない場合、T への変更は取り消されます。
- NOT LOGGED が指定されていた場合、INSERT、UPDATE、または DELETE ステートメントが (コンパイル・エラーではなく) 実行中に失敗すると、T の行はすべて削除されます。
- P において、作業単位またはセーブポイントでロールバック操作が終了し、 その作業単位またはセーブポイントに T の作成が含まれている場合、 このロールバック操作には DROP TABLE T 操作が含まれます。
- P において、作業単位またはセーブポイントでロールバック操作が終了し、その作業単位またはセーブポイントに作成済み一時表 T のドロップが含まれている場合、このロールバック操作によって表のドロップは取り消されます。 NOT LOGGED が指定されている場合は、表も空にされます。
- T を参照していたアプリケーション・プロセスが、終了またはデータベース接続を切断した場合、T 専用のインスタンスはドロップされ、そのインスタンス化された行は破棄されます。
- T を参照していたサーバーへの接続が終了すると、T 専用のインスタンスはドロップされ、そのインスタンス化された行は破棄されます。
- 作成済み一時表に関する制限: 作成済み一時表には、以下のような使用上の制限があります。
- ALTER、LOCK、または RENAME ステートメントでこの一時表を指定することはできません (SQLSTATE 42995)。
- 参照制約でこの一時表を指定することはできません (SQLSTATE 42995)。
-
代替構文: 以下に示す代替構文は、標準的な構文ではありません。
これらは、旧バージョンの製品や他のデータベース製品との互換性を保持するためにサポートされています。
- WITH NO DATA の代わりに DEFINITION ONLY を指定できます。
- DISTRIBUTE BY 節の代わりに PARTITIONING KEY 節または DISTRIBUTE ON 節を指定できます。
- 日時特殊レジスターの値を指定する場合は、CURRENT_TIMESTAMP の代わりに NOW() を指定できます。
- CHAR または VARCHAR の列定義では、CCSID を明示的に指定する必要はありません。正しい CCSID が自動的に使用されます。
ただし、CCSID を明示的に指定する場合は、使用するデータベースのタイプに対応した値にしなければなりません。
CCSID ASCII(非 Unicode データベースの場合)CCSID UNICODE(Unicode データベースの場合)
例
- 例 1: 一時表 CURRENTMAP を作成します。2 列に CODE および MEANING という名前を付け、両方とも NULL を許可しないよう定義します。CODE は数値データを持ち、MEANING は文字データを持ちます。
CREATE GLOBAL TEMPORARY TABLE CURRENTMAP (CODE INTEGER NOT NULL, MEANING VARCHAR(254) NOT NULL) - 例 2: 一時表 TMPDEPT を作成します。
CREATE GLOBAL TEMPORARY TABLE TMPDEPT (TMPDEPTNO CHAR(3) NOT NULL, TMPDEPTNAME VARCHAR(36) NOT NULL, TMPMGRNO CHAR(6), TMPLOCATION CHAR(16) )
