SQL 解説書
DECLARE GLOBAL TEMPORARY TABLE ステートメントは、現行セッションの一時表を定義します。
宣言された一時表の記述は、システム・カタログには現れません。
これは永続的なものではなく、他のセッションと共用することもできません。
同じ名前の宣言されたグローバル一時表を定義するセッションであっても、
一時表の記述はそのセッションによって異なります。
セッションが終了すると、表の行は削除され、一時表の記述はドロップされます。
呼び出し
このステートメントは、アプリケーション・プログラムに組み込むか、
または動的 SQL ステートメントを使用して発行することができます。
このステートメントは、動的に準備可能な実行可能ステートメントです。
許可
このステートメントの許可 ID には、以下の権限が少なくとも 1 つ含まれている必要があります。
- SYSADM または DBADM 権限
- USER TEMPORARY 表スペースでの USE 権限
LIKE または全選択を使用して表を定義する場合、
非分離のストアード・プロシージャーを作成するには、ステートメントの許可 ID の特権に、
識別されているそれぞれの表または視点に対する以下の権限が少なくとも 1 つ以上含まれている必要があります。
- その表または視点に対する SELECT 特権
- その表または視点に対する CONTROL 特権
- SYSADM または DBADM 権限
構文
>>-DECLARE GLOBAL TEMPORARY TABLE--table-name------------------->
.-,------------------------.
V |
>-----+-(-----| column-definition |---+---)--------------------------+>
+-LIKE--+-table-name2-+---+-------------------+----------------+
| '-view-name---' '-| copy-options |--' |
'-AS--(--fullselect--)--DEFINITION ONLY--+-------------------+-'
'-| copy-options |--'
.-ON COMMIT DELETE ROWS---.
>----*--+--------------+--*--+-------------------------+---*--NOT LOGGED--*->
'-WITH REPLACE-' '-ON COMMIT PRESERVE ROWS-'
>----+----------------------+---*------------------------------->
'-IN--tablespace-name--'
>----+------------------------------------------------------------------+---*->
| .-,--------------. |
| V | .-USING HASHING-. |
'-PARTITIONING KEY--(-----column-name---+---)--+---------------+---'
>--------------------------------------------------------------><
column-definition
|---column-name---| data-type |----+---------------------+------|
'-| column-options |--'
column-options
|---*--+-----------+---*--+------------------------------------------------------+---*-->
'-NOT NULL--' +-| default-clause |-----------------------------------+
'-GENERATED--+-ALWAYS-----+---AS--| identity-clause |--'
'-BY DEFAULT-'
>---------------------------------------------------------------|
copy-options
.-COLUMN ATTRIBUTES-.
.-EXCLUDING IDENTITY--+-------------------+--.
|---*--+---------------------------------------+---*--+--------------------------------------------+---*-->
| .-COLUMN-. | | .-COLUMN ATTRIBUTES-. |
'--+-INCLUDING-+--+--------+--DEFAULTS--' '-INCLUDING IDENTITY-+-------------------+---'
'-EXCLUDING-'
>---------------------------------------------------------------|
説明
- 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)。
表には、以下のものを指定できます。
- 最大 500 列の 4K ページ・サイズ。
列のバイト・カウントは 4K ページ・サイズで 4005 を超えてはなりません。
詳細については、行サイズを参照してください。
- 最大 1 012 列の 8K ページ・サイズ。
列のバイト・カウントは 8 101 を超えてはなりません。
詳細については、行サイズを参照してください。
- 最大 1 012 列の 16K ページ・サイズ。
列のバイト・カウントは 16 293 を超えてはなりません。
詳細については、行サイズを参照してください。
- 最大 1 012 列の 32K ページ・サイズ。
列のバイト・カウントは 32 677 を超えてはなりません。
詳細については、行サイズを参照してください。
- data-type
- 使用可能なタイプについては、
CREATE TABLEで data-type を参照してください。
宣言されたグローバル一時表では、BLOB、CLOB、DBCLOB、LONG VARCHAR、LONG VARGRAPHIC、DATALINK、
参照、および構造タイプを使用できませんのでご注意ください (SQLSTATE 42962)。
なお、この例外として、これらの制限されたタイプをソースとする特殊タイプがあります。
FOR BIT DATA は、文字ストリング・データ・タイプの一部として指定することができます。
- column-options
- 表の列に関連した追加オプションを定義します。
- NOT NULL
- 列にヌル値が入るのを防止します。
ヌル値の指定については、CREATE TABLEの NOT NULL を参照してください。
- default-clause
- デフォルトの指定については、
CREATE TABLEの default-clause を参照してください。
- identity-clause
- 識別列の指定については、
CREATE TABLEの identity-clause を参照してください。
- LIKE table-name2 または view-name
- 表の列の名前と記述が、指定された表 (table-name2)、
視点 (view-name)、またはニックネーム (nickname) の列とまったく同じであることを示します。
LIKE の後に指定する名前は、カタログか宣言された一時表に存在している表、視点、
またはニックネームを識別するものでなければなりません。
タイプ付き表またはタイプ付き視点を指定することはできません (SQLSTATE 428EC)。
LIKE は、n 列の暗黙的な定義で使用します。
n は、指定した表または視点に含まれる列の数を表します。
- 表を指定した場合の暗黙的な定義では、table-name2 の各列について、
その列名、データ・タイプ、およびヌル可能特性を定義します。
EXCLUDING COLUMN DEFAULTS を指定しないと、列のデフォルト値も入ります。
- 視点を指定すると、
暗黙的な定義には view-name に指定した全選択のおのおのの結果列の列名、
データ・タイプ、およびヌル可能特性が入ります。
copy-attributes 文節に基づいて、
列のデフォルトと ID 列属性を組み込んだり除外したりすることができます。
指定した表や視点のこの他の属性は、暗黙的な定義には含めません。
したがって、新しい表には固有制約、外部キー制約、トリガー、または索引はありません。
表は、IN 文節の指定に従って、表スペースの中に明示的または暗黙的に作成されます。
table-name2 や view-name には、
作成されているグローバル一時表と同じ名前を使用することはできません (SQLSTATE 428EC)。
- AS (fullselect) DEFINITION ONLY
- 表定義が、照会式の結果による列定義に基づいていることを示します。
AS (fullselect) は、
宣言されたグローバル一時表に対する n 列の暗黙的な定義で使用されます。
n は、fullselect の結果として得られる列の数を表します。
新しい表の列は、これらの fullselect で得られた列に基づいて定義されます。
選択リストの各エレメントの名前は、それぞれ固有なものでなければなりません (SQLSTATE 42711)。
SELECT 文節で AS 文節を使用すると、それぞれのエレメントに固有の名前を付けることができます。
暗黙的な定義では、fullselect の各結果列について、
その列名、データ・タイプ、およびヌル可能特性を定義します。
- copy-options
- これらのオプションでは、
ソースの結果表定義 (表、視点、または全選択) から付加的な属性をコピーするかどうかを指定します。
- INCLUDING COLUMN DEFAULTS
- ソース結果表の定義の更新可能な各列の列デフォルトをコピーします。
更新可能でない列では、作成される表の対応列内にデフォルトが定義されないことになります。
LIKE table-name2 が指定されており、
かつ table-name2 が基礎表か宣言された一時表である場合に限り、
この INCLUDING COLUMN DEFAULTS がデフォルトとして使用されます。
- EXCLUDING COLUMN DEFAULTS
- 列のデフォルトは、ソースの結果表定義からコピーされません。
この文節がデフォルトです。ただし、LIKE table-name が指定され、
しかも table-name が基礎表または一時表を指定する場合を除きます。
- INCLUDING IDENTITY COLUMN ATTRIBUTES
- この文節を使用すると、
ソースの結果表定義から識別列の属性 (START WITH、INCREMENT BY、および CACHE の値) がコピーされます。
これらの属性をコピーできるのは、表、視点、または全選択内の対応する列のエレメントが、
識別のプロパティーが含まれている基礎表の列名に直接または間接的にマップされた表の列の名前、
または視点の列の名前である場合です。
これ以外の場合は、新しい一時表の列に識別のプロパティーは定義されません。
たとえば、次のような場合があります。
- 全選択の選択リストに識別列の名前のインスタンスが複数含まれている (つまり、
同じ列を複数回選択している) 場合
- 全選択の選択リストに複数の識別列が含まれている (つまり、結合が関与している) 場合
- 識別列が選択リスト内の式に組み込まれている場合
- 全選択にセット演算 (UNION (合併)、EXCEPT (差)、または INTERSECT (論理積)) が含まれている場合
- EXCLUDING IDENTITY COLUMN ATTRIBUTES
- ソース結果表の定義から ID 列属性はコピーされません。
- ON COMMIT
- COMMIT 操作の実行時にグローバル一時表で行うアクションを指定します。
- DELETE ROWS
- 表にオープンされている WITH HOLD カーソルがなければ、すべての行が表から削除されます。
これはデフォルト値です。
- PRESERVE ROWS
- 表の行が保存されます。
- NOT LOGGED
- 表の作成を含め、表に対して行われた変更は記録されません。
たとえば、作業単位 (または保管点) で表に変更を加えていた場合は、
ROLLBACK (または ROLLBACK TO SAVEPOINT) 操作を実行すると表の行がすべて削除されます。
また、作業単位 (または保管点) で表を作成していた場合には、その表は除去されます。
そして作業単位 (または保管点) で表を除去していた場合には、
表が復元されますが、行は復元されません。
さらに、表で INSERT、UPDATE、または DELETE 操作を実行するステートメントにエラーが発生した場合も、
表の行はすべて削除されてしまいます。
- WITH REPLACE
- ユーザーが指定した名前を持つグローバル一時表がすでに存在している場合は、
既存の表をこのステートメントで定義された一時表と置き換える (および既存の表の行をすべて削除する) よう指示します。
WITH REPLACE が指定されていない場合は、
現行セッションにすでに存在しているグローバル一時表の名前を指定することはできません (SQLSTATE 42710)。
- IN tablespace-name
- グローバル一時表をインスタンス化する表スペースを指定します。
ここでは、既存の USER TEMPORARY 表スペースを指定する必要があります (SQLSTATE 42838)。
また、ステートメントの許可 ID にはその表スペースに対する USE 特権が含まれていなければなりません (SQLSTATE 42501)。
この文節が指定されない場合、
表をインスタンス化する表スペースは USER TEMPORARY 表スペースの中から選択され、
その中のステートメントの許可 ID に USE 特権が含まれている表スペースで、
かつ必要なページ・サイズに最も適したサイズの表スペースが使用されます。
複数の表スペースがそれにあてはまる場合、
以下のどれに USE 特権が付与されているかに応じて優先順位が決められます。
- 許可 ID
- 許可 ID を保有するグループ
- PUBLIC
それでも複数の表スペースがそれにあてはまる場合は、
最終選択はデータベース・マネージャーによって行われます。
条件にかなう USER TEMPORARY がない場合はエラーが戻されます (SQLSTATE 42727)。
表スペースの決定は、以下の時点で変更することができます。
- 表スペースを除去または作成するとき
- USE 特権を付与または取り消すとき
十分な表のページ・サイズは、行のバイト・カウントか列の数のいずれかによって決まります。
詳細については、行サイズを参照してください。
- PARTITIONING KEY (column-name,...)
- 表のデータが区分化されている場合に、区分化キーを指定します。
各 column-name (列名) は、表の列を指定するものでなければなりません。
また、同じ列を複数回指定することはできません。
この文節の指定がなく、この表が複数区分のノードグループに存在する場合は、
その区分化キーが宣言された一時表の最初の列として定義されます。
宣言された一時表では、単一区分のノードグループに定義された表スペースにおいて、
すべての列の集合を区分化キーの定義に使用することができます。
このパラメーターの指定がない場合、区分化キーは作成されません。
区分化キーの列は更新できませんのでご注意ください (SQLSTATE 42997)。
- USING HASHING
- データ配分の区分化方式として、ハッシュ関数を使用することを指定します。
これは、サポートされる唯一の区分化方式です。
注
- 宣言されたグローバル一時表の参照: 宣言されたグローバル一時表の記述は DB2 カタログ (SYSCAT.TABLES) に現れないため、
この記述は永続的なものではなく、またデータベース接続によって共有することもできません。
それで、同じ table-name という宣言されたグローバル一時表を定義するセッションであっても、
その宣言されたグローバル一時表の記述はそれぞれのセッションによって異なる可能性があります。
SQL ステートメント (DECLARE GLOBAL TEMPORARY TABLE ステートメントは除く) を使用して宣言されたグローバル一時表を参照するためには、
その表をスキーマ名 SESSION で明示的または暗黙的に修飾する必要があります。
table-name が SESSION で修飾されていない場合、
宣言されたグローバル一時表は参照を決定する際に認識されません。
グローバル一時表が名前によって宣言されていない接続で SESSION.table-name を参照する場合は、
カタログ内の持続オブジェクトから参照先が決定されます。
そのオブジェクトが存在しない場合はエラーが戻されます (SQLSTATE 42704)。
- バインドしているパッケージに、
SESSION によって暗黙的または明示的に修飾された表を参照する静的 SQL ステートメントが含まれている場合、
それらのステートメントは静的にはバインドされません。
これらのステートメントは、呼び出されると、
パッケージのバインドにおいて VALIDATE オプションが選択されているかどうかにかかわらず増分的にバインドされます。
ステートメントの実行時には、宣言された一時表が存在する場合はその一時表に対して、
存在しない場合は永続表に対して各表の参照が行われます。
このどちらも存在しない場合はエラーが戻されます (SQLSTATE 42704)。
- 特権: 宣言されたグローバル一時表を定義する場合、
その表を定義するユーザーには、表を除去する権限も含めて、その表に対するすべての表特権が授与されます。
加えて、PUBLIC に対しても同様の特権が授与されます。
89
これらの特権を持つユーザーは、
すでに定義されている宣言されたグローバル一時表を参照するセッションで、
すべての 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 への変更が含まれている場合、
このロールバック操作には SESSION.T からの DELETE 操作が含まれます。
P において、作業単位または保管点でロールバック操作が終了し、
その作業単位または保管点に SESSION.T への宣言が含まれている場合、
このロールバック操作には DROP SESSION.T 操作が含まれます。
P において、作業単位または保管点でロールバック操作が終了し、
その作業単位または保管点に宣言された一時表 SESSION.T の除去が含まれている場合、
このロールバック操作によって表の除去は取り消されますが、表の行は復元されません。
- アプリケーションによって、
宣言された T が終了されたり、データベースとの接続が切断された場合、
T は除去され、そのインスタンス化された行は破棄されます。
- T の宣言が行われたサーバーへの接続が終了すると、
T は除去され、そのインスタンス化された行は破棄されます。
- 宣言されたグローバル一時表の使用に関する制限: 宣言されたグローバル一時表には、
次のような使用上の制限があります。
- ALTER、COMMENT、GRANT、LOCK、RENAME、
または REVOKE ステートメントでこの一時表を指定することはできません (SQLSTATE 42995)。
- CREATE ALIAS、CREATE FUNCTION (SQL スカラー、表、または行)、CREATE INDEX、
CREATE TRIGGER、または CREATE VIEW ステートメントでこの一時表を参照することはできません (SQLSTATE 42995)。
- 参照制約でこの一時表を指定することはできません (SQLSTATE 42995)。
脚注:
- 89
-
GRANT オプションによって授与される特権はありません。
また、これらの特権はいずれもカタログ表には現れません。
[ ページのトップ | 前ページ | 次ページ | 目次 | 索引 ]