DECLARE GLOBAL TEMPORARY TABLE ステートメント

DECLARE GLOBAL TEMPORARY TABLE ステートメントは、現行セッションの一時表を定義します。

宣言済み一時表の記述は、システム・カタログには現れません。 これは永続的なものではなく、他のセッションと共有することもできません。 同じ名前の宣言済みグローバル一時表を定義するセッションであっても、 一時表の記述はそのセッションによって異なります。 セッションが終了すると、表の行は削除され、一時表の記述はドロップされます。

呼び出し

このステートメントは、アプリケーション・プログラムに組み込んだり、動的 SQL ステートメントを使用して発行したりすることができます。 このステートメントは、動的に作成できる実行可能ステートメントです。

許可

ステートメントの許可 ID によって保持されている特権には、少なくとも以下のいずれかの権限が含まれていなければなりません。
  • USER TEMPORARY 表スペースでの USE 特権
  • DBADM 権限
  • SYSADM 権限
  • SYSCTRL 権限
LIKE または全選択を使用して表を定義する場合、 ステートメントの許可 ID の特権に、 識別されているそれぞれの表またはビューに対する以下の権限が少なくとも 1 つ以上含まれている必要があります。
  • その表またはビューに対する SELECT 特権
  • 表またはビューが含まれるスキーマに対する SELECTIN 特権
  • 表またはビューに対する CONTROL 特権
  • 表またはビューが含まれるスキーマに対するスキーマ DATAACCESS 権限
  • DATAACCESS 権限

構文

構文図を読む構文図をスキップするDECLARE GLOBAL TEMPORARY TABLEtable-name (,column-definition)LIKEtable-name1view-namecopy-optionsAS(fullselect)WITH NO DATAWITH DATAcopy-options ORGANIZE BYROWCOLUMN ON COMMIT DELETE ROWSON COMMIT PRESERVE ROWS LOGGEDNOT LOGGEDON ROLLBACK DELETE ROWSON ROLLBACK PRESERVE ROWS WITH REPLACE INtablespace-name distribution-clause
column-definition
構文図を読む構文図をスキップするcolumn-namedata-typecolumn-options
data-type
構文図を読む構文図をスキップするbuilt-in-type
built-in-type
構文図を読む構文図をスキップするSMALLINTINTEGERINTBIGINTDECIMALDECNUMERICNUM(5,0)( integer,0, integer)FLOAT(53)( integer)REALDOUBLEPRECISIONDECFLOAT(34)(16)CHARACTERCHAR(1)( integerOCTETSCODEUNITS32)VARCHARCHARACTERCHARVARYING( integerOCTETSCODEUNITS32)1FOR BIT DATACLOBCHARACTERCHARLARGE OBJECT(1M)( integerKMGOCTETSCODEUNITS32)GRAPHIC(1)( integerCODEUNITS16CODEUNITS32)VARGRAPHIC( integerCODEUNITS16CODEUNITS32)DBCLOB(1M)( integerKMGCODEUNITS16CODEUNITS32)NCHARNATIONALCHARCHARACTER(1)( integer)NVARCHARNCHAR VARYINGNATIONALCHARCHARACTERVARYING( integer)NCLOBNCHAR LARGE OBJECTNATIONAL CHARACTER LARGE OBJECT(1M)( integerKMG)BINARY(1)( integer)VARBINARYBINARY VARYING(integer)BLOBBINARY LARGE OBJECT(1M)( integerKMG)DATETIMETIMESTAMP(6)(integer)XML
column-options
構文図を読む構文図をスキップする NOT NULL default-clauseGENERATEDALWAYSBY DEFAULTASIDENTITYidentity-options
default-clause
構文図を読む構文図をスキップするWITHDEFAULT default-values
default-values
構文図を読む構文図をスキップするconstantdatetime-special-registeruser-special-registerCURRENT SCHEMANULLcast-function(constantdatetime-special-registeruser-special-registerCURRENT SCHEMA)EMPTY_CLOB()EMPTY_DBCLOB()EMPTY_NCLOB()EMPTY_BLOB()
copy-options
構文図を読む構文図をスキップする INCLUDINGEXCLUDINGCOLUMNDEFAULTS EXCLUDING IDENTITYCOLUMN ATTRIBUTESINCLUDING IDENTITYCOLUMN ATTRIBUTES
distribution-clause
構文図を読む構文図をスキップする DISTRIBUTE BYHASH(,column-name)
注:
  • 1 FOR BIT DATA 節とその後に続く他の列制約とは、任意の順序で指定できます。FOR BIT DATA 節をストリング単位 CODEUNITS32 とともに指定することはできません (SQLSTATE 42613)。

説明

table-name
一時表の名前を示します。 修飾子を明示的に指定する場合は、SESSION でなければなりません。 そうしないと、エラーになります (SQLSTATE 428EK)。 修飾子が指定されなければ、暗黙的に SESSION が指定されます。

同じ table-name の宣言済み一時表を定義するセッションであっても、その宣言済み一時表の記述はそれぞれのセッションによって異なります。table-name を使用する宣言済み一時表がセッション内に既に存在している場合は、 WITH REPLACE 節を指定する必要があります (SQLSTATE 42710)。

表、ビュー、別名、またはニックネームについては、 同じ名前および同じスキーマ名 (SESSION) を持つものがカタログ内に既に存在していても構いません。 このような場合には、次のような処理が行われます。
  • 宣言されている一時表 table-name は、正常に定義されます (エラーや警告は戻されません)。
  • SESSION.table-name への参照はすべて、カタログ内で既に定義されている SESSION.table-name ではなく、宣言済み一時表に対して行われます。
column-definition
一時表の列の属性を定義します。
column-name
表を構成する列の名前を指定します。 名前を修飾したり、表の複数の列に対して同じ名前を使用することはできません (SQLSTATE 42711)。
行オーガナイズ表では以下の属性を指定できます。
  • 4K ページ・サイズの場合、最大 500 列。列のバイト・カウントは 4005 を超えてはなりません。
  • 8K ページ・サイズの場合、最大 1012 列。列のバイト・カウントは 8101 を超えてはなりません。
  • 16K ページ・サイズの場合、最大 1012 列。列のバイト・カウントは 16,293 を超えてはなりません。
  • 32K ページ・サイズの場合、最大 1012 列。列のバイト・カウントは 32,677 を超えてはなりません。

カラム・オーガナイズ表には、ページ・サイズにかかわりなく最大で 1012 個の列を設定できます。各列のバイト・カウントは、32,677 以下でなければなりません。拡張行サイズのサポートは、カラム・オーガナイズ表 には適用されません。

作成済み一時表には、行開始列、行終了列、トランザクション開始 ID 列のいずれも含めることができません。

詳細については、『CREATE TABLE ステートメント』の『行サイズ』を参照してください。

data-type
列のデータ・タイプを指定します。
built-in-type
組み込みデータ・タイプを指定します。built-in-type の説明については、『CREATE TABLE』を参照してください。

宣言済み一時表に SYSPROC.Db2SECURITYLABEL データ・タイプを指定することはできません。

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)
fullselect から得られる結果表の列ごとに、対応する表の列を定義することを指定します。定義する各列には、結果表の対応列から以下の属性が取り込まれます (各データ・タイプに該当する場合)。
  • 列名
  • 列の説明
  • データ・タイプ、長さ、精度、および位取り
  • NULL 可能
以下の属性は取り込まれません (ただし、デフォルト値と識別属性は、copy-options を使用して取り込むことができます)。
  • デフォルト値
  • 識別属性
  • 非表示属性
  • ROW CHANGE TIMESTAMP
  • 全選択で参照されている表やビューの他の任意指定の属性
次の制限が適用されます。
  • 選択リストの各エレメントの名前は、それぞれユニークなものでなければなりません (SQLSTATE 42711)。 SELECT 節で AS 節を使用すると、それぞれのエレメントにユニークな名前を付けることができます。
  • 全選択では、ホスト変数を参照することも、パラメーター・マーカーを組み込むこともできません。
  • 全選択の結果列のデータ・タイプは、表の列に対して有効なデータ・タイプでなければなりません。
  • 全選択で指定した表の行レベルまたは列レベルのアクセス制御 (RCAC) をアクティブにしても、RCAC は新しい表にカスケードされません。
WITH NO DATA | WITH DATA
表の列にデータを取り込むかどうかを指定します。
WITH NO DATA
全選択を実行しません。表の定義に使用するだけで、照会の結果は表に取り込みません。
WITH DATA
全選択を実行して、照会の結果を表に取り込みます。
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 列属性はコピーされません。
ORGANIZE BY
表のデータ・ページにおけるデータの編成方法を指定します。
ROW
データは、表のデータ・ページに行単位で保管されます。各データ・ページには、表の 1 つ以上の行のデータが保管されます。
COLUMN
データは、表のデータ・ページに列単位で保管されます。各データ・ページには、表の 1 つの列のデータが保管されます。 これはデフォルトです。
ON COMMIT
COMMIT 操作の実行時にグローバル一時表で行うアクションを指定します。 デフォルトは DELETE ROWS です。
DELETE ROWS
表にオープンされている WITH HOLD カーソルがなければ、すべての行が表から削除されます。
PRESERVE ROWS
表の行が保存されます。
LOGGED または NOT LOGGED
表に対する操作をログに記録するかどうかを指定します。 デフォルトは LOGGED です。
LOGGED
表の作成またはドロップだけではなく、表に対する挿入、更新、または削除操作をログに記録するよう指定します。
NOT LOGGED
表に対する挿入、更新、または削除操作をログに記録せず、表の作成またはドロップをログに記録するよう指定します。 ROLLBACK (または ROLLBACK TO SAVEPOINT) 操作中に:
  • 表が作業単位 (またはセーブポイント) 内で作成された場合、表はドロップされます。
  • 表が作業単位 (またはセーブポイント) 内でドロップされた場合、表は再作成されますが、データは消失します。
ON ROLLBACK
ROLLBACK (または ROLLBACK TO SAVEPOINT) 操作が実行されるときに、 記録されていないグローバル一時表に対して取られるアクションを指定します。 デフォルトは DELETE ROWS です。
DELETE ROWS
表データが変更されている場合は、すべての行が削除されます。
PRESERVE ROWS
表の行が保存されます。
WITH REPLACE
ユーザーが指定した名前を持つ宣言済み一時表が既に存在している場合は、 既存の表をこのステートメントで定義した一時表で置き換える (および既存の表の行をすべて削除する) よう指示します。

WITH REPLACE が指定されていない場合は、 現行セッションに既に存在している宣言済み一時表の名前を指定することはできません (SQLSTATE 42710)。

IN tablespace-name
宣言済み一時表をインスタンス化する表スペースを指定します。 ここでは、既存の USER TEMPORARY 表スペースを指定する必要があります (SQLSTATE 42838)。 また、ステートメントの許可 ID にはその表スペースに対する USE 特権が含まれていなければなりません (SQLSTATE 42501)。 この節が指定されない場合、 表をインスタンス化する表スペースは USER TEMPORARY 表スペースの中から選択され、 その中のステートメントの許可 ID に USE 特権が含まれている表スペースで、 かつ必要なページ・サイズに最も適したサイズの表スペースが使用されます。 複数の表スペースがそれにあてはまる場合、 以下のどれに USE 特権が付与されているかに応じて優先順位が決められます。
  1. 許可 ID
  2. 許可 ID を保有するグループ
  3. PUBLIC
それでも複数の表スペースがそれに当てはまる場合は、 最終選択はデータベース・マネージャーによって行われます。 条件に合う USER TEMPORARY 表スペースがない場合はエラーが戻されます (SQLSTATE 42727)。
表スペースの決定は、以下の時点で変更することができます。
  • 表スペースをドロップまたは作成するとき
  • USE 特権を付与または取り消すとき

十分な表のページ・サイズは、行のバイト・カウントか列の数のいずれかによって決まります。 詳細については、『CREATE TABLE ステートメント』の『行サイズ』を参照してください。

distribution-clause
データベース・パーティションの方式、つまり複数のデータベース・パーティションにデータを配分させる方法を指定します。
DISTRIBUTE BY HASH (column-name,...)
複数のデータベース・パーティションにデータを分散させる方式として、分散キー という指定の列でデフォルトのハッシュ機能を使用する方式を指定します。 column-name は、表の列を指定する非修飾名でなければなりません (SQLSTATE 42703)。 同じ列を複数回指定することはできません (SQLSTATE 42709)。 データ・タイプが BLOB、CLOB、DBCLOB、XML、またはこれらのタイプのいずれかに基づく特殊タイプ、構造化タイプの列は、分散キーの一部として使用できません (SQLSTATE 42962)。

この節が指定されておらず、この表が複数データベース・パーティションの複数パーティション・データベース・パーティション・グループに存在する場合、 デフォルトの分散キーが自動的に定義されます。

デフォルトの分散キーの要件を満たす列が存在しない場合は、分散キーなしで表が作成されます。 このような表は、単一パーティションのデータベース・パーティション・グループに対して定義された表スペースでのみ認められています。

単一パーティションのデータベース・パーティション・グループに対して定義された表スペースの表の場合は、分散キーとして有効なデータ・タイプの任意の列の集合を分散キーの定義に使用できます。 この節の指定がない場合、分散キーは作成されません。

  • USER TEMPORARY 表スペースは、宣言済み一時表が宣言される前に、存在しなくてはなりません (SQLSTATE 42727)。
  • 宣言済み一時表の参照: 宣言済み一時表の記述はデータベース・カタログ (SYSCAT.TABLES) に現れないため、この記述は永続的なものではなく、またデータベース接続によって共有することもできません。従って、同じ table-name という宣言済みグローバル一時表を定義するセッションであっても、その宣言済み一時表の記述はそれぞれのセッションによって異なる可能性があります。

    SQL ステートメント (DECLARE GLOBAL TEMPORARY TABLE ステートメントは除く) を使用して宣言済み一時表を参照するためには、その表をスキーマ名 SESSION で明示的または暗黙的に修飾する必要があります。table-name が SESSION で修飾されていない場合、宣言済み一時表は参照を決定する際に認識されません。

    宣言済み一時表が名前によって宣言されていない接続で SESSION.table-name を参照する場合は、カタログ内の持続オブジェクトから参照先が決定されます。そのオブジェクトが存在しない場合はエラーが戻されます (SQLSTATE 42704)。

  • バインドしているパッケージに、 SESSION によって暗黙的または明示的に修飾された表を参照する静的 SQL ステートメントが含まれている場合、 それらのステートメントは静的にはバインドされません。 これらのステートメントは、呼び出されると、 パッケージのバインドにおいて VALIDATE オプションが選択されているかどうかにかかわらず、バインドされ追加されていきます。 ステートメントの実行時には、各表の参照は、宣言済み一時表が存在する場合はその一時表に、存在しない場合は作成済み一時表、または永続表に解決されます。 何も存在しない場合はエラーが戻されます (SQLSTATE 42704)。
  • 特権: 宣言済み一時表を定義する場合、その表を定義するユーザーには、表をドロップする権限も含めて、その表に対するすべての表特権が付与されます。加えて、PUBLIC に対しても同様の特権が GRANT されます。 (GRANT オプションによって GRANT される特権はありません。 また、これらの特権はいずれもカタログ表には現れません。) これらの特権を持つユーザーは、既に定義されている宣言済み一時表を参照するセッションで、すべての SQL ステートメントを実行することができます。
  • インスタンス化と終了: 以下の説明において、それぞれ P はセッションを、T はセッション P の中の宣言済み一時表を示しています。
    • T の空のインスタンスは、 P で実行される DECLARE GLOBAL TEMPORARY TABLE ステートメントの結果として作成されます。
    • P で実行されるすべての SQL ステートメントでは T を参照することができます。 そして、P で T を参照する場合は、すべてその同じインスタンスが参照されます。
    • SQL プロシージャーのコンパウンド・ステートメント (BEGIN と END で定義される) で DECLARE GLOBAL TEMPORARY TABLE ステートメントを指定すると、宣言済み一時表の有効範囲がコンパウンド・ステートメントだけでなく接続にまで広がり、表はコンパウンド・ステートメントの外部からも認識されるようになります。表はコンパウンド・ステートメントの END で暗黙的にドロップされません。 宣言済み一時表は、その表が明示的にドロップされない限り、同じ名前を使用してセッション内の他のコンパウンド・ステートメントで複数回定義することはできません。
    • ON COMMIT DELETE ROWS 節が暗黙的または明示的に指定された場合は、 P においてコミット操作が作業単位で終了し、 T に属する WITH HOLD カーソルが 1 つも P にオープンされていない状態になると、 操作 DELETE FROM SESSION.T がコミットに組み込まれます。
    • P において、作業単位またはセーブポイントでロールバック操作が終了し、その作業単位またはセーブポイントに SESSION.T への変更が含まれている場合、次のようになります。
      • NOT LOGGED が指定されていた場合は、ON ROLLBACK PRESERVE ROWS も指定されていた場合を除き、SESSION.T の行はすべて削除されます。
      • NOT LOGGED が指定されていない場合、T への変更は取り消されます。
    • NOT LOGGED が指定されていた場合、INSERT、UPDATE、または DELETE ステートメントが (コンパイル・エラーではなく) 実行中に失敗すると、SESSION.T の行はすべて削除されます。
    • P において、作業単位またはセーブポイントでロールバック操作が終了し、 その作業単位またはセーブポイントに SESSION.T への宣言が含まれている場合、 このロールバック操作には DROP SESSION.T 操作が含まれます。
    • P において、作業単位またはセーブポイントでロールバック操作が終了し、 その作業単位またはセーブポイントに宣言済み一時表 SESSION.T のドロップが含まれている場合、 このロールバック操作によって表のドロップは取り消されます。 NOT LOGGED が指定されている場合は、表も空にされます。
    • アプリケーションによって、 宣言された T が終了されたり、データベースとの接続が切断された場合、 T はドロップされ、そのインスタンス化された行は破棄されます。
    • T の宣言が行われたサーバーへの接続が終了すると、 T はドロップされ、そのインスタンス化された行は破棄されます。
  • 宣言済み一時表の使用に関する制限: 宣言済み一時表には、以下のような使用上の制限があります。
    • ALTER、COMMENT、GRANT、LOCK、RENAME、 または REVOKE ステートメントでこの一時表を指定することはできません (SQLSTATE 42995)。
    • AUDIT、CREATE ALIAS、または CREATE VIEW ステートメントでこの一時表を参照することはできません (SQLSTATE 42995)。
    • 参照制約でこの一時表を指定することはできません (SQLSTATE 42995)。
  • 宣言済み一時表には、データ行圧縮が使用可能です。パフォーマンスが向上することをデータベース・マネージャーが判別すると、基本表のオブジェクトにインラインで保管される XML 文書を含む表の行データが圧縮されます。しかし、宣言済み一時表の XML ストレージ・オブジェクトのデータ圧縮はサポートされていません。
  • 宣言済み一時表に作成される索引には、索引圧縮が使用可能です。
  • 宣言済み一時表に作成される索引には、デフォルトで索引圧縮が使用可能です。圧縮はオンとして示されますが、適切なライセンス (IBM Db2® Storage Optimization Feature) が適用されていなければ索引は圧縮されません。
  • 代替構文: 以下に示す代替構文は、標準的な構文ではありません。 これらは、旧バージョンの製品や他のデータベース製品との互換性を保持するためにサポートされています。
    • 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: 従業員番号、給与、ボーナス、および歩合用の列定義を持つ宣言済み一時表を定義します。
       DECLARE GLOBAL TEMPORARY TABLE SESSION.TEMP_EMP
          (EMPNO  CHAR(6) NOT NULL,
           SALARY DECIMAL(9, 2),
           BONUS  DECIMAL(9, 2),
           COMM   DECIMAL(9, 2)) ON COMMIT PRESERVE ROWS 
  • 例 2: 基本表の USER1.EMPTAB が存在し、この表に 3 つの列があり、その 1 つが ID 列だとします。 基本表と同じ列名と属性 (識別属性を含む) を持つ一時表を宣言します。
    DECLARE GLOBAL TEMPORARY TABLE TEMPTAB1
       LIKE USER1.EMPTAB
       INCLUDING IDENTITY
       ON COMMIT PRESERVE ROWS
    この例では、SESSION が TEMPTAB1 の暗黙修飾子として使用されます。

Netezza Performance Server (NPS) の一時表との互換性

一時表を宣言する必要がある場合は、DECLARE GLOBAL TEMPORARY TABLE ステートメントを使用することをお勧めします。ただし、IBM® Netezza® SQL との互換性を確保するために、代わりに CREATE TEMPORARY TABLE ステートメントを使用することもできます。
DECLARE GLOBAL TEMPORARY TABLE ステートメントの場合とは異なり、CREATE TEMPORARY TABLE ステートメントでは、表名を SESSION 以外のスキーマ名で修飾できます。デフォルトのスキーマは、現在のスキーマです。SESSION 以外のスキーマの場合は、以下のようになります。
  • STATIC SQL 内で宣言済み一時表を参照するには、VALIDATE RUN を指定してパッケージをバインドする必要があります。
  • 結果として、セッションでパッケージ・キャッシュを使用できなくなる可能性があります。
  • スキーマ名を SYS で始めることはできません (SQLSTATE 42939)。
カタログに記述されている表、ビュー、ニックネーム、別名と同じ名前を一時表の修飾名として使用することはできません (SQLSTATE 42710)。
CREATE TEMPORARY TABLE ステートメントには、DECLARE GLOBAL TEMPORARY TABLE の構文エレメントに対応する以下の構文エレメントを追加できます。
  • 列定義のリスト。
  • DISTRIBUTE BY HASH 節。互換性を確保するために、DISTRIBUTE ON HASH を代わりに指定することもできます。
  • AS fullselect 節。ただし、fullselect は、DECLARE GLOBAL TEMPORARY TABLE で指定する場合とは異なり、括弧で囲まないことに注意してください。
以下の 2 つのステートメントは等価であり、同じ結果になります。
CREATE TEMPORARY TABLE table_name (column_definition) AS fullselect

DECLARE GLOBAL TEMPORARY TABLE table_name (column_definition) AS (fullselect) WITH DATA
  ON COMMIT PRESERVE ROWS LOGGED