説明
このステートメントは、ビューを作成するために使用します。
使用上の制限と注意事項
OR REPLACE 句を指定した場合、このステートメントは既存のビューを置き換えることができます。
ビューはデータベース内では実際にはテーブルの形で存在するわけではありません。ビューは CREATE VIEW ステートメントで指定された SELECT ステートメントの結果として派生され、使用するたびに再び派生されます。
FROM 句で2つ以上のテーブルまたはビューを参照する場合、そのビューは結合ビュー(Join View)と呼ばれます。更新可能な結合ビュー、または変更可能な結合ビューは、2つ以上のベーステーブルまたはビューに関連し、DML操作を許可します。更新可能なビューは WITH READ ONLY 句の制限を受けません。
更新可能性を実現するためには、ビューが満たす必要がある複数の条件があります。例えば、一般的なルールの1つとして、結合ビューに対する INSERT、UPDATE、または DELETE 操作では、一度に1つのベーステーブルしか変更できないというものがあります。
権限要件
CREATE VIEW ステートメントを実行するには、現在のユーザーが CREATE VIEW 権限を持っている必要があります。OceanBaseデータベースの権限の詳細については、Oracleモードの権限分類を参照してください。
構文
CREATE [OR REPLACE] [[NO] FORCE] VIEW view_name [(column_name_list)]
AS select_stmt
[view_check_option];
select_stmt:
SELECT column_name, [--string]
[, column_name, [--string] ...]
FROM from_list
[WHERE condition]
column_name_list:
column_name [, column_name ...]
view_check_option:
WITH READ ONLY
| WITH CHECK OPTION
パラメータの説明
パラメータ |
説明 |
|---|---|
| OR REPLACE | 作成しようとするビュー名が既に存在する場合、新しい定義でビューを再作成します。 |
| [NO] FORCE | ビューの作成時に、そのビューに基づくテーブルや参照対象のオブジェクトタイプが存在するかどうか、およびビューが配置されているスキーマの所有者が権限を持っているかどうかを考慮しない場合は、FORCE を指定してください。基礎となるテーブルが存在し、かつビューが配置されているスキーマの所有者が権限を持っている場合にのみビューを作成する場合は、NOFORCE を指定してください。NOFORCE がデフォルト設定です。 |
| view_name | ビュー名。 |
| column_name_list | ビューは基礎となるテーブルと同様に、重複しない一意の列名を持たなければなりません。デフォルトでは、SELECT ステートメントで取得した列名がビューの列名として使用されます。ビューの列に明示的な名前を定義するには、オプションの column_name_list 句を使用でき、IDはカンマで区切ります。column_name_list の名前の数は、SELECT ステートメントで取得する列数と同じでなければなりません。SELECT ステートメントで取得する列は、テーブル列への単純な参照でも、関数、定数値、演算子などを使用した式でもかまいません。 |
| select_stmt | SELECT ステートメントの一種です。ビューの定義を記述します。このステートメントは、基礎となるテーブルや他のビューから選択を行います。SELECT ステートメントの詳細については、SIMPLE SELECTを参照してください。 |
| --string | オプションです。ビューにコメントを追加するために使用します。コメントはビュー定義に保存されます。
説明
|
| view_check_option | オプションです。ビューの追加属性を指定するために使用します。詳細については、後述の view_check_option を参照してください。 |
view_check_option
WITH READ ONLY:ビューを作成または置き換える際のオプションで、そのビューをデータの読み取り専用として使用し、DML操作(INSERT、UPDATE、DELETE)には使用できないように指定します。つまり、ビューを通じた挿入、更新、削除操作を禁止します。WITH CHECK OPTION:ビューを作成する際の構文で、挿入または更新されるデータがビューの定義条件を満たすことを保証します。つまり、ビューを通じたDML操作を許可しますが、操作後のデータはビューの定義条件を満たしている必要があります。説明
Oracleモードでは、
WITH CHECK OPTION構文はLOCALまたはCASCADEDを指定することはサポートされておらず、デフォルトはCASCADEDです。OceanBaseデータベースは、ビューのフィルタ条件(
where_clause)にサブクエリを含む場合にWITH CHECK OPTION句を指定することもサポートしています。注意
フィルタ条件で
WITH CHECK OPTION句を使用する場合、ビュー定義でJOIN操作の使用は現在サポートされていません。
例
テストテーブル tbl1 と tbl2 を作成します。
obclient> CREATE TABLE tbl1 (col1 INT, col2 VARCHAR(50));
obclient> CREATE TABLE tbl2 (col1 INT, col2 INT);
テーブル
tbl1の列col1とcol2を選択して、ビューv1_t1を作成します。obclient> CREATE OR REPLACE FORCE VIEW v1_t1(vcol1, vcol2) AS SELECT col1, col2 FROM tbl1;テーブル
tbl2の列col1とcol2に基づいてビューv2_t2を作成します。v2_t2にはtbl2.col2 > 1を満たすすべてのデータが含まれます。obclient> CREATE VIEW v2_t2 AS SELECT * FROM tbl2 WHERE tbl2.col2 > 1 WITH CHECK OPTION;テーブル
tbl2の列col1とcol2に基づいてビューv3_t3を作成し、同時にビューv3_t3にコメントを追加します。ビュー
v3_t3を作成します。obclient> CREATE VIEW v3_t3 AS SELECT col1, --test.col1 col2 --test.col2 FROM tbl2;SHOW CREATE VIEWまたはDBMS_METADATA.GET_DDLを使用してビューのコメントを確認します。SHOW CREATE VIEWを使用してビューのコメントを確認します。obclient> SHOW CREATE VIEW v3_t3;実行結果は次のとおりです:
+-------+------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+ | VIEW | CREATE VIEW | CHARACTER_SET_CLIENT | COLLATION_CONNECTION | +-------+------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+ | V3_T3 | CREATE VIEW "V3_T3" ("COL1", "COL2") AS SELECT col1, --test.col1 col2 --test.col2 FROM tbl2 | utf8mb4 | utf8mb4_bin | +-------+------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+ 1 row in setDBMS_METADATA.GET_DDLを使用してビューのコメントを確認します。obclient> SELECT DBMS_METADATA.GET_DDL('VIEW', 'V3_T3', 'SYS') FROM DUAL;実行結果は次のとおりです:
+-------+------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+ | VIEW | CREATE VIEW | CHARACTER_SET_CLIENT | COLLATION_CONNECTION | +-------+------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+ | V3_T3 | CREATE VIEW "V3_T3" ("COL1", "COL2") AS SELECT col1, --test.col1 col2 --test.col2 FROM tbl2 | utf8mb4 | utf8mb4_bin | +-------+------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+ 1 row in set (0.028 sec) obclient(SYS@oracle001)[SYS]> SELECT DBMS_METADATA.GET_DDL('VIEW', 'V3_T3', 'SYS') FROM DUAL; +------------------------------------------------------------------------------------------------------------------------------------------+ | DBMS_METADATA.GET_DDL('VIEW','V3_T3','SYS') | +------------------------------------------------------------------------------------------------------------------------------------------+ | CREATE VIEW "V3_T3" ("COL1", "COL2") AS SELECT col1, --test.col1 col2 --test.col2 FROM tbl2 | +------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set
フィルター条件のサブクエリの後に
WITH CHECK OPTION句を指定します。obclient> CREATE OR REPLACE VIEW v4_t1 AS SELECT * FROM tbl1 t1 WHERE EXISTS (SELECT 1 FROM tbl2 t2 WHERE t2.col1 = t1.col1) WITH CHECK OPTION;