3.7. DDL コマンド
Data Virtualization は、一時テーブルを作成または破棄し、実行時に手順および定義を表示する DDL コマンドのサブセットと互換性があります。現在、一時的なメタデータエントリーを任意にドロップしたり、作成したりすることはできません。 仮想データベースでスキーマを定義するのに使用できる DDL ステートメントの詳細は、「 DDL メタデータ 」を参照してください。
3.7.1. 一時的なテーブル リンクのコピーリンクがクリップボードにコピーされました!
Data Virtualization で一時(一時)テーブルを作成して使用できます。一時的なテーブルは動的に作成されますが、他の物理テーブルとして扱われます。
3.7.1.1. ローカルの一時テーブル リンクのコピーリンクがクリップボードにコピーされました!
ローカルの一時テーブルは、INSERT ステートメントで参照するか、CREATE TABLE ステートメントで明示的に定義することで定義できます。暗黙的に作成された一時テーブルには、#
で始まる名前が必要です。
Data Virtualization は、一時テーブルが作成される仮想手順のセッションまたはブロックに一時テーブルがスコープされることを意味します。この解釈は SQL 仕様とは異なり、他のデータベースベンダーが実装する解釈とは異なります。ブロックを終了するか、セッションを終了すると、テーブルが破棄されます。呼び出し手順が作成するセッションテーブルおよびその他の一時テーブルは、呼び出された手順には表示されません。同じ名前の一時的なテーブルが呼び出された手順で作成されると、新規インスタンスが作成されます。
作成構文
ローカルの一時テーブルを明示的に作成することも、暗黙的に作成することもできます。
- 明示的な作成構文
ローカル一時テーブルは、以下の例のように CREATE TABLE ステートメントで明示的に定義できます。
CREATE LOCAL TEMPORARY TABLE name (column type [NOT NULL], ... [PRIMARY KEY (column, ...)]) [ON COMMIT PRESERVE ROWS]
CREATE LOCAL TEMPORARY TABLE name (column type [NOT NULL], ... [PRIMARY KEY (column, ...)]) [ON COMMIT PRESERVE ROWS]
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - SERIAL データ型を使用して NOT NULL および auto-incrementing INTEGER 列を指定します。SERIAL 列の開始値は 1 です。
- 暗黙的な作成構文
ローカルの一時テーブルは、INSERT ステートメントで参照することで暗黙的に定義できます。
INSERT INTO #name (column, ...) VALUES (value, ...) INSERT INTO #name [(column, ...)] select c1, c2 from t
INSERT INTO #name (column, ...) VALUES (value, ...) INSERT INTO #name [(column, ...)] select c1, c2 from t
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注記#name
が存在しない場合は、値式の指定の列名とタイプを使用して定義されます。INSERT INTO #name (column, ...) VALUES (value, ...) INSERT INTO #name [(column, ...)] select c1, c2 from t
INSERT INTO #name (column, ...) VALUES (value, ...) INSERT INTO #name [(column, ...)] select c1, c2 from t
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注記#name
が存在しない場合は、ターゲット列名とクエリーベースの列の型を使用して定義されます。ターゲット列が指定されていない場合、列名はクエリーから派生した列名と一致します。
ドロップの構文
DROP TABLE name
DROP TABLE name
+ 以下の例では、一連のステートメントが 2 つのソースからの一時テーブルを読み込み、レコードを手動で挿入してから、SELECT クエリーで一時テーブルを使用します。
例: ローカルの一時テーブル
CREATE LOCAL TEMPORARY TABLE TEMP (a integer, b integer, c integer); SELECT * INTO temp FROM Src1; SELECT * INTO temp FROM Src2; INSERT INTO temp VALUES (1,2,3); SELECT a,b,c FROM Src3, temp WHERE Src3.a = temp.b;
CREATE LOCAL TEMPORARY TABLE TEMP (a integer, b integer, c integer);
SELECT * INTO temp FROM Src1;
SELECT * INTO temp FROM Src2;
INSERT INTO temp VALUES (1,2,3);
SELECT a,b,c FROM Src3, temp WHERE Src3.a = temp.b;
ローカルの一時テーブルの使用の詳細は、「 仮想手順」を参照し てください。
3.7.1.2. グローバルな一時テーブル リンクのコピーリンクがクリップボードにコピーされました!
グローバルな一時テーブルは、デプロイ時に Data Virtualization に提供するメタデータから作成されます。ローカルの一時テーブルとは異なり、実行時にグローバル一時テーブルを作成することはできません。グローバル一時テーブルは、スキーマエントリーで共通の定義を共有します。ただし、各セッションに一時テーブルの新しいインスタンスが作成されます。セッションが終了すると、テーブルが破棄されます。明示的なドロップサポートはありません。グローバル一時テーブルの一般的な用途は、結果を手順から除外することです。
作成構文
CREATE GLOBAL TEMPORARY TABLE name (column type [NOT NULL], ... [PRIMARY KEY (column, ...)]) OPTIONS (UPDATABLE 'true')
CREATE GLOBAL TEMPORARY TABLE name (column type [NOT NULL], ... [PRIMARY KEY (column, ...)]) OPTIONS (UPDATABLE 'true')
SERIAL データ型を使用する場合、グローバル一時テーブルの各セッションのインスタンスには独自のシーケンスが設定されます。
一時テーブルを更新する場合は、UPDATABLE を明示的に指定する必要があります。
構文オプションの詳細は、スキーマオブジェクトの DDL メタデータ の CREATE TABLE
DDL ステートメントを参照してください。
3.7.1.3. グローバルおよびローカルの一時テーブルの一般的な機能 リンクのコピーリンクがクリップボードにコピーされました!
グローバルおよびローカルの一時テーブルは、一般的な機能の一部を共有します。
プライマリーキーの使用
- すべてのキー列は比較する必要があります。
- プライマリーキーを使用する場合は、SQL 比較演算子および IN、LIKE、および ORDER BY 演算子の検索の改善を可能にするクラスター化されたインデックスを作成します。
-
Null
はプライマリーキーの値として使用できますが、すべての null キーを持つ 1 行のみが必要になります。
トランザクション
-
READ_UNCOMMITED
トランザクション分離レベルがあります。分離レベルを高くすることのできるロックメカニズムはありません。また、ロールバックの結果は複数のトランザクション間で一貫性がなくなる可能性があります。同時トランザクションが同じローカル一時テーブルまたはセッションに関連付けられていない場合、トランザクションの分離レベルは効果的にシリアライズ可能です。ローカルの一時テーブルと完全な一貫性が必要な場合は、1 度に 1 つのトランザクションとの接続のみを使用します。この操作のモードは、トランザクションによる接続を追跡する接続プールにより保証されます。
制限事項
-
CREATE TABLE
構文では、基本的なテーブル定義(列名、タイプ、および null 可能な情報)と任意のプライマリーキーのみを指定できます。グローバル一時テーブルの場合、ephemeral ステートメントの追加メタデータは、一時テーブルインスタンスの作成時に事実上無視されます。ただし、他のテーブルエントリーと同様の計画でメタデータが使用される可能性があります。 -
ON COMMIT PRESERVE ROWS
を使用できます。他のON COMMIT
アクションを使用することはできません。 - DROP ステートメントに「drop behavior」オプションを使用することはできません。
- 一時テーブルは、フェイルオーバーセーフではありません。
- インラインではない LOB 値(XML、CLOB、BLOB、JSON、ジオメトリー)は、一時的なテーブルの値ではなく、参照によって追跡されます。一時テーブルに外部ソースからの LOB 値を挿入すると、関連するステートメントまたは接続が閉じられると読み取れない場合があります。
3.7.1.4. 外部一時テーブル リンクのコピーリンクがクリップボードにコピーされました!
ローカルまたはグローバルな一時テーブルとは異なり、外部一時テーブルは、メタデータの負荷ではなく、ランタイム時に作成される実際のソーステーブルへの参照となります。
外部一時テーブルには、明示的な作成構文が必要です。
CREATE FOREIGN TEMPORARY TABLE name ... ON schema
CREATE FOREIGN TEMPORARY TABLE name ... ON schema
テーブル作成ボディー構文は標準の CREATE FOREIGN TABLE DDL ステートメントと同じです。詳細は、DDL メタデータ を参照してください。通常、ソースの名前の設定、最新の状態、ネイティブタイプなど、ソーステーブルに適切にアクセスするには DDL OPTION 句の使用が必要になる場合があります。
スキーマ名は、VDB に既存のスキーマ/モデルを指定する必要があります。テーブルには、そのソースにあるかのようにアクセスされます。ただし、Data Virtualization 内では、一時的なテーブルのスコープは、フォレンジではない一時テーブルと同じスコープになります。つまり、外部一時テーブルは Data Virtualization スキーマに属しず、作成先のセッションまたは手順ブロックにスコープ指定されます。
外部一時テーブルの DROP 構文は、foreign 以外の一時テーブルの場合と同じです。
外部一時テーブルの CREATE や対応する DROP はいずれも、pushdown コマンドを発行しません。このメカニズムは、Data Virtualization 内での一時的なソーステーブルを公開します。
FOREIGN TEMPORARY TABLE には 2 つの使用シナリオがあります。1 つ目は、ソースの追加テーブルに動的にアクセスすることです。もう 1 つは、パフォーマンス上の理由から、Data Virtualization のローカル一時テーブルの使用を置き換えます。後者の場合の使用方法パターンは次のようになります。
ネイティブ手順を使用してソース固有の CREATE DDL をソースに渡すことに注意してください。Data Virtualization は現在、CREATE ステートメントに基づいて一時的なテーブルのソース作成のプッシュを試行しません。上記のネイティブ手順などの他のメカニズムでは、最初にテーブルを作成しておく必要があります。また、DDL の定義テーブルはデフォルトでデータ可能ではないので、テーブルは明示的に updatable とマークされることに注意してください。
ソースの一時テーブルの処理は、これを意図した通りに機能させるためにも理解しておく必要があります。すべてのセッションに同じ GLOBAL テーブル定義を使用するソース(Oracle など)、またはセッションスコープの一時テーブルを使用するソース(PostgreSQL など)はトランザクションでアクセスされると機能します。以下の理由によりトランザクションが必要です。
- コミットの動作(DELETE ROWS または DROP など)のソースによってクリーンアップが行われます。Data Virtualization ドロップはソースコマンドを実行せず、保証されていないことに注意してください(例外が発生した場合、データベース接続の損失、ハードシャットダウンなど)。
- トランザクションによる接続を追跡する場合、Data Virtualization によるそのソースの複数の使用が同じ接続/セッションを使用するようにし、同じ一時テーブルとデータを使用します。
Data Virtualization では ON COMMIT
句を使用することはできません。その結果、ローカルの一時テーブルでは、ソーステーブルの ON COMMIT
動作がデフォルトの PRESERVE ROWS
とは異なる可能性があります。