CREATE VIEW
目的
CREATE
VIEW
文を使用すると、ビューを定義できます。ビューとは、1つ以上の表またはビューをベースとした論理表です。ビュー自体にはデータは含まれていません。ビューのベースとなる表は、実表と呼ばれます。
LOB、オブジェクト型、REF
データ型、ネストした表またはVARRAY型をサポートするオブジェクト・ビューまたはリレーショナル・ビューを、既存のビュー・メカニズムで作成することもできます。オブジェクト・ビューとは、ユーザー定義型のビューのことで、ビューの各行に、それぞれが一意のオブジェクト識別子を持つオブジェクトが含まれます。
XMLType
ビューも作成できます。このビューは、オブジェクト・ビューと似ていますが、XMLType
のXMLスキーマベースの表のデータを表示します。
関連項目:
-
様々な種類のビューおよびその使用方法については、『Oracle Database概要』、『Oracle Database開発ガイド』および『Oracle Database管理者ガイド』を参照してください。
-
XMLType
ビューの詳細は、『Oracle XML DB開発者ガイド』を参照してください。 -
ビューの変更およびデータベースからのビューの削除については、「ALTER VIEW」および「DROP VIEW」を参照してください。
前提条件
自分のスキーマ内にビューを作成する場合は、CREATE
VIEW
システム権限が必要です。他のユーザーのスキーマ内にビューを作成する場合は、CREATE
ANY
VIEW
システム権限が必要です。
サブビューを作成する場合は、UNDER
ANY
VIEW
システム権限またはスーパービューに対するUNDER
オブジェクト権限が必要です。
ビューが含まれているスキーマの所有者は、そのビューの基礎となっているすべての表またはビューに対する行の選択(READ
またはSELECT
権限)、挿入、更新または削除の権限が必要です。また、所有者には、これらの権限がロールを介してではなく、直接付与されている必要があります。
オブジェクト・ビューの作成時にオブジェクト型の基本コンストラクタ・メソッドを使用する場合、次のいずれかの条件を満たしている必要があります。
-
オブジェクト型が作成対象のビューと同じスキーマに属している。
-
EXECUTE
ANY
TYPE
システム権限を持っている。 -
そのオブジェクト型に対する
EXECUTE
オブジェクト権限を持っている。
構文
create_view::=
(inline_constraint::=およびout_of_line_constraint::=、object_view_clause::=、XMLType_view_clause::=、subquery::= (SELECT
の一部)、subquery_restriction_clause::=)
XMLType_view_clause::=
XMLSchema_spec::=
セマンティクス
OR REPLACE
OR
REPLACE
を指定すると、既存のビューを再作成できます。この句を使用した場合、以前に付与されたオブジェクト権限を削除、再作成、再付与しなくても、既存のビュー定義を変更できます。
従来型のビューを再作成した場合、そのビューで定義されたINSTEAD
OF
トリガーは削除されます。エディショニング・ビューを再作成した場合、エディショニング・ビューで定義されたDMLトリガーは保持されます。ただし、エディショニング・ビューの変更によってコンパイルできない場合(たとえば、トリガー定義で参照されるエディショニング・ビュー列を削除した場合など)は、これらのトリガーを永続的に無効にできます。
すべてのマテリアライズド・ビューがview
に依存している場合、そのマテリアライズド・ビューにはUNUSABLE
というマークが付けられ、それらが再利用可能になるようにリストアする場合は、完全なリフレッシュが必要になります。無効なマテリアライズド・ビューはクエリー・リライトで使用されることはなく、また、再コンパイルされるまでリフレッシュされません。
従来型のビューからエディショニング・ビューに、またはエディショニング・ビューから従来型のビューに置き換えることはできません。エディショニング・ビューの詳細は、『Oracle Database開発ガイド』を参照してください。
関連項目:
-
無効なマテリアライズド・ビューのリフレッシュについては、「ALTER MATERIALIZED VIEW」を参照してください。
-
マテリアライズド・ビューの概要は、『Oracle Database概要』を参照してください。
-
INSTEAD
OF
句の詳細は、「CREATE TRIGGER」を参照してください。
FORCE
FORCE
を指定すると、ビューの実表または参照するオブジェクト型が存在しているか、またはそのビューを含むスキーマの所有者が、それらの表やオブジェクト型に対する権限を持っているかにかかわらず、ビューを作成できます。SELECT
、INSERT
、UPDATE
またはDELETE
文をビューに対して発行する場合、これらの条件を満たしている必要があります。
ビュー定義が制約を含む場合、実表または参照するオブジェクト型が存在しないと、CREATE
VIEW
... FORCE
は正常に実行されません。また、ビュー定義で存在しない制約が指定される場合も、CREATE
VIEW
... FORCE
は正常に実行されません。
EDITIONING
この句を使用すると、エディショニング・ビューを作成できます。エディショニング・ビューは単一表ビューであり、実表からすべての行を選択し、実表の列のサブセットを表示します。エディショニング・ビューを使用すると、アップグレードなどの管理操作時に、アプリケーションに影響を与えることなく実表に対するDDL変更を実行できます。実表に対する既存のエディショニング・ビューの関係について、情報を取得する場合は、USER_
、ALL_
およびDBA_EDITIONING_VIEW
データ・ディクショナリ・ビューを問い合せます。
エディショニング・ビューの所有者は、エディション化が可能である必要があります。詳細は、「ENABLE EDITIONS」を参照してください。
エディショニング・ビューのノート
エディショニング・ビューと従来型のビューには、次のような重要な違いがあります。
-
エディショニング・ビューは、表の列のサブセットの別名を選択して表示するためにのみ使用されます。そのため、エディショニング・ビューを作成する構文には、従来型のビューを作成する構文よりも多くの制限事項があります。制限事項(内容については後述)に違反すると、
FORCE
を指定しても、ビューを作成できません。 -
エディショニング・ビューには、DMLトリガーを作成できます。この場合、データベースは、エディショニング・ビューをこのトリガーに対する基本オブジェクトとみなします。このようなトリガーは、DML操作がエディショニング・ビューそのものを対象とした場合に起動します。DML操作が実表を対象とした場合には起動しません。
-
エディショニング・ビューには、
INSTEAD
OF
トリガーを作成できません。
エディショニング・ビューの制限事項
エディショニング・ビューには、次の制限事項があります。
-
どのエディション内でも、単一表に対して作成できるエディショニング・ビューは1つのみです。
-
object_view_clause
句、XMLType_view_clause
句、またはBEQUEATH
句は指定できません。 -
エディショニング・ビューには、
WITH
CHECK
OPTION
制約を定義できません。 -
定義する副問合せのSELECT構文のリストには、実表の列に対する単純な参照のみを指定できます。また、実表の各列を1回にかぎりSELECT構文のリストに指定できます。ワイルド・カード記号であるアスタリスク
*
およびt_alias
.*
は、実表のすべての列を指定する場合に使用できます。 -
ビューを定義する副問合せの
FROM
句で参照できるのは、既存の1つのデータベース表のみです。結合は使用できません。実表は作成対象のビューと同じスキーマに属している必要があります。表の識別にシノニムは使用できません。ただし、表の別名を指定することはできます。 -
副問合せを定義する次の句は、エディショニング・ビューには無効です。
subquery_factoring_clause
、DISTINCT
またはUNIQUE
、where_clause
、hierarchical_query_clause
、group_by_clause
、HAVING
条件、model_clause
、または集合演算子(UNION
、INTERSECT
またはMINUS
)。
関連項目:
-
エディショニング・ビューの詳細は、『Oracle Database開発ガイド』を参照してください。
-
エディションの詳細およびエディショニング・ビューの例は、「CREATE EDITION」を参照してください。
EDITIONABLE | NONEDITIONABLE
この句を使用すると、schema
のスキーマ・オブジェクト・タイプVIEW
のエディショニングが有効化されたときに、そのビューをエディション・オブジェクトにするか非エディション・オブジェクトにするかを指定できます。デフォルトは、EDITIONABLE
です。エディション・オブジェクトと非エディション・オブジェクトの詳細は、『Oracle Database開発ガイド』を参照してください。
schema
ビューを含めるスキーマを指定します。schema
を指定しない場合、自分のスキーマにそのビューが作成されます。
view
ビューまたはオブジェクト・ビューの名前を指定します。名前は、「データベース・オブジェクトのネーミング規則」に指定されている要件を満たしている必要があります。
ビューの制限事項
あるビューにINSTEAD
OF
トリガーが含まれている場合、そのビューに対して作成されるビューが更新可能であっても、そのビューにはINSTEAD
OF
トリガーが必要です。
関連項目:
SHARING
この句は、アプリケーション・ルートにビューを作成する場合にのみ適用されます。このタイプのビューはアプリケーション共通オブジェクトと呼ばれ、そのデータは、アプリケーション・ルートに属するアプリケーションPDBと共有できます。ビュー・データの共有方法を決定するには、次の共有属性のいずれかを指定します。
-
METADATA
- メタデータ・リンクはビューのメタデータを共有しますが、そのデータは各コンテナに固有です。このタイプのビューは、メタデータリンク・アプリケーション共通オブジェクトと呼ばれます。 -
DATA
- データ・リンクはビューを共有し、そのデータはアプリケーション・コンテナ内のすべてのコンテナに対して同じです。そのデータはアプリケーション・ルートにのみ格納されます。このタイプのビューは、データリンク・アプリケーション共通オブジェクトと呼ばれます。 -
EXTENDED
DATA
- 拡張データ・リンクはビューを共有し、アプリケーション・ルートのそのデータはアプリケーション・コンテナ内のすべてのコンテナに対して同じです。ただし、アプリケーション・コンテナの各アプリケーションPDBには、アプリケーションPDBに一意のデータを格納できます。このタイプのビューの場合、データはアプリケーション・ルートに格納され、オプションで各アプリケーションPDBに格納されます。このタイプのビューは、拡張データリンク・アプリケーション共通オブジェクトと呼ばれます。 -
NONE
- ビューは共有されません。
この句を省略すると、データベースはDEFAULT_SHARING
初期化パラメータの値を使用して、ビューの共有属性を決定します。DEFAULT_SHARING
初期化パラメータに値が含まれていない場合、デフォルトはMETADATA
です。
従来型のビューを作成する場合は、METADATA
、DATA
、EXTENDED
DATA
またはNONE
を指定できます。
オブジェクト・ビューまたはXMLTYPE
ビューを作成する場合は、METADATA
またはNONE
のみを指定できます。
ビューの共有属性は、作成後は変更できません。
関連項目:
-
DEFAULT_SHARING
初期化パラメータの詳細は、Oracle Databaseリファレンスを参照してください -
アプリケーション共通オブジェクトの作成の詳細は、『Oracle Database管理者ガイド』を参照してください。
alias
ビューを定義する問合せによって選択された式の名前を指定します。別名の数は、ビューによって選択された式の数と一致している必要があります。別名は、Oracle Databaseのスキーマ・オブジェクトのネーミング規則に従う必要があります。別名は、ビュー内で一意である必要があります。
別名を省略した場合、別名は問合せの列または列の別名から導出されます。このため、問合せに列の名前のみでなく式が含まれている場合は、別名を使用する必要があります。また、ビュー定義に制約が含まれている場合も、別名を指定する必要があります。
ビューの別名の制限事項
オブジェクト・ビューを作成するとき、別名を指定することはできません。
VISIBLE | INVISIBLE
この句を使用すると、ビュー列をVISIBLE
にするか、INVISIBLE
にするかを指定できます。デフォルトでは、実表の可視性にかかわらず、ビュー列はVISIBLE
になります。ただし、INVISIBLE
を指定した場合を除きます。これは、従来型のビューとエディショニング・ビューに当てはまります。これらの句の詳細は、CREATE
TABLE
のドキュメントの「VISIBLE | INVISIBLE」を参照してください。
inline_constraintおよびout_of_line_constraint
ビューおよびオブジェクト・ビューには制約を指定できます。out_of_line_constraint
句を使用すると、ビュー・レベルで制約を定義できます。適切な別名の後でinline_constraint
句を使用すると、列定義または属性定義の一部として制約を定義できます。
Oracle Databaseでは、ビュー制約を適用していません。制限事項を含むビュー制約の詳細は、「ビュー制約」を参照してください。
関連項目:
object_view_clause
object_view_clause
を使用すると、オブジェクト型にビューを定義できます。
関連項目:
この句を使用すると、type_name
型のオブジェクト・ビューを明示的に作成できます。オブジェクト・ビューの列は、type_name
型の最上位属性に対応しています。各行にはオブジェクト・インスタンスが含まれ、また、各インスタンスはWITH
OBJECT
IDENTIFIER
句で指定したオブジェクト識別子に関連付けられます。schema
を指定しない場合、自分のスキーマ内にオブジェクト・ビューが作成されます。
オブジェクト表、XMLType
表、オブジェクト・ビューおよびXMLType
ビューには、列名は付けられません。そのため、システム生成疑似列OBJECT_ID
が定義されます。問合せでこの列名を使用し、WITH
OBJECT
IDENTIFIER
句を指定して、オブジェクト・ビューを作成できます。
WITH OBJECT IDENTIFIER句
WITH
OBJECT
IDENTIFIER
句を使用すると、最上位(ルート)のオブジェクト・ビューを指定できます。オブジェクト・ビュー内の各行を識別するためのキーとして使用されるオブジェクト型の属性を指定します。ほとんどの場合、各属性は実表の主キー列と対応します。属性リストが一意で、ビューの1行ずつを識別することを確認する必要があります。WITH
OBJECT
IDENTIFIER
およびWITH
OBJECT
ID
句は、区別なしに使用できますが、意味を明確にするために用意されています。
オブジェクト・ビューの制限事項
オブジェクト・ビューには、次の制限事項があります。
-
オブジェクト・ビュー内の複数のインスタンスに変換される主キー
REF
を参照解除または確保しようとした場合、データベースはエラーを戻します。 -
サブビューはスーパービューのオブジェクト識別子を継承するため、サブビューを作成する場合は、この句を指定できません。
オブジェクト・ビューがオブジェクト表またはオブジェクト・ビュー上で定義されている場合は、この句を省略するか、またはDEFAULT
を指定します。
DEFAULT
DEFAULT
を指定すると、基礎となるオブジェクト表またはオブジェクト・ビュー固有のオブジェクト識別子を使用して、各行を一意に識別できます。
attribute
attribute
では、オブジェクト・ビューに対して作成されるオブジェクト識別子の基になるオブジェクト型の属性を指定します。
UNDER句
UNDER
句を使用すると、オブジェクト・スーパービューに基づくサブビューを指定できます。
サブビューの制限事項
サブビューには、次の制限事項があります。
-
サブビューは、スーパービューと同じスキーマに作成する必要があります。
-
オブジェクト型
type_name
は、superview
直属のサブタイプである必要があります。 -
同一のスーパービューには、特定の型のサブビューを1つのみ作成できます。
関連項目:
-
オブジェクトの作成の詳細は、「CREATE TYPE」を参照してください。
-
データ・ディクショナリ・ビューの詳細は、『Oracle Databaseリファレンス』を参照してください。
XMLType_view_clause
この句を使用すると、XMLType
ビューを作成できます。このビューには、XMLType
のXMLスキーマベースの表のデータが表示されます。XMLSchema_spec
は、XMLデータを対応するオブジェクト・リレーショナル・データにマップするために使用するXMLスキーマを示します。XMLスキーマは、XMLType
ビューを作成する前に作成しておく必要があります。
WITH
OBJECT
IDENTIFIER
およびWITH
OBJECT
ID
句は、区別なしに使用できますが、意味を明確にするために用意されています。
オブジェクト表、XMLType
表、オブジェクト・ビューおよびXMLType
ビューには、列名は付けられません。そのため、システム生成疑似列OBJECT_ID
が定義されます。問合せでこの列名を使用し、WITH
OBJECT
IDENTIFIER
句を指定して、オブジェクト・ビューを作成できます。
関連項目:
-
XMLType
ビューおよびXMLSchemasの詳細は、『Oracle XML DB開発者ガイド』を参照してください。 -
「XMLTypeビューの作成: 例」および「XMLType表のビューの作成: 例」を参照してください。
DEFAULT COLLATION
この句を使用して、ビューのデフォルトの照合を指定します。デフォルトの照合は、ビューを定義する問合せに含まれるすべての文字リテラルについて、導出された照合として使用されます。デフォルトの照合は、ビューの列では使用されません。ビューの列の照合は、ビューの定義副問合せから導出されます。CREATE
VIEW
文は、その文字列のいずれかが、導出された照合がない定義副問合せの式に基づいている場合は、エラーが発生して失敗します。
collation_name
には、有効な名前付き照合または疑似照合を指定します。
この句を省略した場合、ビューのデフォルトの照合は、ビューを含むスキーマの有効スキーマのデフォルトの照合に設定されます。有効なスキーマのデフォルトの照合の詳細は、「ALTER
SESSION
」のDEFAULT_COLLATION句を参照してください。
DEFAULT
COLLATION
句を指定できるのは、COMPATIBLE
初期化パラメータが12.2
以上に設定され、かつMAX_STRING_SIZE
初期化パラメータがEXTENDED
に設定されている場合のみです。
ビューのデフォルトの照合を変更するには、ビューを再作成する必要があります。
ビューのデフォルトの照合の制限事項
ビューを定義する問合せにWITH
plsql_declarations
句が含まれている場合、ビューのデフォルトの照合はUSING_NLS_COMP
である必要があります。
BEQUEATH
BEQUEATH
句を使用すると、ビューで参照されるファンクションをビューの実行者権限で実行するか、ビューの定義者権限で実行するかを指定できます。
BEQUEATH
CURRENT_USER
を指定すると、ビューで参照されるファンクションは、次の条件のいずれかが満たされているときに、ビューの実行者権限で実行されます。
-
ビューの所有者が、実行ユーザーに対する
INHERIT
PRIVILEGES
オブジェクト権限を所持している。 -
ビューの所有者が、
INHERIT
ANY
PRIVILEGES
システム権限を所持している。
ビューの問合せがIDまたは権限に影響を受けるSQLファンクションを実行する場合や、実行者権限のPL/SQLまたはJavaファンクションを実行する場合、その操作の実行範囲内での現在のスキーマ、現在のユーザー、およびその時点で有効にされるロールは、ビューの所有者から継承されるのではなく、問合せを実行したユーザーの環境から継承されます。
この句が、ビュー自体を実行者権限オブジェクトに変換することはありません。ビュー内での名前解決は、引き続きビューの所有者のスキーマを使用して処理され、ビューの権限チェックは、ビューの所有者の権限で実行されます。
BEQUEATH
DEFINER
を指定すると、ビューで参照されるファンクションは、ビューの定義者権限で実行されます。ビューへの問合せがIDまたは権限に影響を受けるSQLファンクションを実行する場合や、実行者権限のPL/SQLまたはJavaファンクションを実行する場合、その操作の実行範囲内での現在のスキーマ、現在のユーザー、およびその時点で有効にされるロールは、ビューの所有者から継承されます。
ビュー内での名前解決はビューの所有者のスキーマを使用して処理され、ビューの権限チェックはビューの所有者の権限で実行されます。
これはデフォルトです。
BEQUEATH句の制限事項
この句はEDITIONING
句とともに指定できません。
関連項目:
ビューでの実行者権限および定義者権限を制御する方法の詳細は、『Oracle Databaseセキュリティ・ガイド』を参照してください。
AS subquery
ビューの基になっている表(実表)の列と行を識別する副問合せを指定します。副問合せのSELECT構文のリストには1000以下の式を指定できます。
リモート表およびリモート・ビューを参照するビューを作成する場合、CREATE
DATABASE
LINK
文のCONNECT
TO
句を使用して、指定するデータベース・リンクを作成しておく必要があります。また、ビュー副問合せのスキーマ名で修飾する必要があります。
ビューを定義する問合せでflashback_query_clause
を使用してビューを作成した場合、AS
OF
式は作成時には解析されず、ユーザーがビューを問い合せるたびに解析されます。
関連項目:
Oracleフラッシュ・バック問合せの詳細は、「結合ビューの作成: 例」および『Oracle Database開発ガイド』を参照してください。
ビューを定義する問合せの制限事項
ビュー問合せには、次の制限事項があります。
-
副問合せでは、
CURRVAL
およびNEXTVAL
疑似列を選択できません。 -
副問合せで
ROWID
、ROWNUM
またはLEVEL
の各疑似列を選択する場合、そのビュー副問合せには列の別名が必要です。 -
副問合せでアスタリスク(*)を使用して表のすべての列を選択し、後でその表に新しい列を追加する場合、
CREATE
OR
REPLACE
VIEW
文を発行してビューを再作成するまで、追加した列はそのビューに含まれません。 -
オブジェクト・ビューの場合、副問合せのSELECT構文のリスト内の要素数は、そのオブジェクト型の最上位属性数と同じである必要があります。それぞれの選択要素のデータ型は、対応する最上位属性と同じである必要があります。
-
SAMPLE
句は指定できません。
これらの制限は、マテリアライズド・ビューにも適用されます。
次のノートは、更新可能なビューに適用されます。
更新可能なビューとは、実表の行を挿入、更新または削除できるビューです。更新可能なビューを作成するか、またはビューにINSTEAD OF
トリガーを作成して更新可能にすることができます。
更新可能なビューの列を更新する方法を学習するには、USER_UPDATABLE_COLUMNS
データ・ディクショナリ・ビューを問い合せます。このビューで表示される情報は、更新可能なビューのみに意味があります。ビューを更新可能にするには、次の条件が満たされている必要があります。
-
ビューの各列は、単一表の列にマップする必要があります。たとえば、ビューの列が
TABLE
句の出力にマップする場合(コレクション・ネスト解除)、ビューは更新可能ではありません。
-
ビューには、次の構造体が含まれていない必要があります。
- 集合演算子
DISTINCT
演算子- 集計ファンクションまたは分析ファンクション
GROUP
BY
、ORDER
BY
、MODEL
、CONNECT
BY
またはSTART
WITH
句SELECT
構文のリストにあるコレクション式SELECT
構文のリストにある副問合せWITH READ ONLY
が指定された副問合せ- 結合(一部の例外を除く。詳細は、『Oracle Database管理者ガイド』を参照してください。)
-
更新可能なビューが疑似列または式を含む場合は、これらの疑似列または式を参照する
UPDATE
文を使用して、実表の行を更新できません。 -
結合ビューを更新可能にする場合、次のすべての条件が満たされている必要があります。
-
DML文は、結合の基になる1つの表のみに影響する。
-
INSERT
文で、WITH
CHECK
OPTION
を指定してビューを作成しておらず、値が挿入されたすべての列がキー保存表の列である。実表の各主キーまたは一意キーの値に対するキー保存表は、結合ビューで一意である。 -
UPDATE
文で、WITH
CHECK
OPTION
を指定してビューを作成しておらず、更新されるすべての列はキー保存表から抽出されている。 -
DELETE
文の場合、結合によって複数のキー保存表が作成されると、ビューがWITH
CHECK
OPTION
を指定して作成されたかどうかにかかわらず、FROM
句に指定された最初の表から削除されます。
-
関連項目:
-
更新可能なビューの詳細は、『Oracle Database管理者ガイド』を参照してください。
-
更新可能な結合ビューおよびキー保存表の例は、「更新可能なビューの作成: 例」および「結合ビューの作成: 例」を参照し、更新できないビューの
INSTEAD
OF
トリガーの例は、『Oracle Database PL/SQL言語リファレンス』を参照してください。
subquery_restriction_clause
subquery_restriction_clause
を使用すると、次のいずれかの方法で、ビューを定義する問合せを制限できます。
WITH READ ONLY
WITH
READ
ONLY
を指定すると、表またはビューを更新禁止にできます。
WITH CHECK OPTION
WITH
CHECK
OPTION
を指定すると、副問合せに含まれない行を生成する表またはビューの変更を禁止できます。この句をDML文の副問合せ内で使用する場合、FROM
句内の副問合せには指定できますが、WHERE
句内の副問合せには指定できません。
CONSTRAINT constraint
READ
ONLY
またはCHECK
OPTION
制約の名前を指定します。この識別子を省略した場合、その制約にSYS_C
n
という形式の名前が自動的に割り当てられます。この場合のnは、その制約名をデータベース内で一意の名前にする整数です。
ノート:
表にWITH
CHECK
OPTION
を指定すると、挿入および更新処理の結果、表を定義する副問合せによって選択可能な表が戻されることが保証されます。ビューでは、次の場合、WITH
CHECK
OPTION
を指定してもこれらの保証はされません。
-
対象のビュー、または対象のビューの基礎となるビューを定義する問合せ内に、副問合せが含まれている場合。
-
INSERT
、UPDATE
またはDELETE
操作がINSTEAD
OF
トリガーを使用して実行された場合。
subquery_restriction_clauseの制限事項
ORDER
BY
句を指定する場合、この句は指定できません。
関連項目:
CONTAINER_MAP
CONTAINER_MAP
句を指定して、コンテナ・マップを使用したビューの問合せを有効化します。
CONTAINERS_DEFAULT
CONTAINERS_DEFAULT
句を指定して、CONTAINERS
句に対してビューを有効化します。
例
ビューの作成: 例
次の文は、emp_view
というサンプル表employees
のビューを作成します。このビューには、部門20の従業員とその年間給与が表示されます。
CREATE VIEW emp_view AS SELECT last_name, salary*12 annual_salary FROM employees WHERE department_id = 20;
この場合、副問合せで式salary*12
に列の別名(annual_salary
)を使用しているため、この式に基づく列の名前をビュー宣言で定義する必要はありません。
エディショニング・ビューの作成: 例
次の文は、orders
表のエディショニング・ビューを作成します。
CREATE EDITIONING VIEW ed_orders_view (o_id, o_date, o_status) AS SELECT order_id, order_date, order_status FROM orders WITH READ ONLY;
このビューを使用すると、アップグレードなどの管理操作時に、アプリケーションに影響を与えることなくorders
表に対するDDL変更を実行できます。DML操作がこのビューそのものを対象とした場合にDMLトリガーを起動するよう、このビューにDMLトリガーを作成できます。ただし、DML操作がorders
表を対象とした場合には起動しません。
制約付きのビューの作成: 例
次の文は、サンプル表hr.employees
の制限付きのビューを作成し、ビューの列email
に一意制約を定義し、ビューの列emp_id
にビューに対する主キー制約を定義します。
CREATE VIEW emp_sal (emp_id, last_name, email UNIQUE RELY DISABLE NOVALIDATE, CONSTRAINT id_pk PRIMARY KEY (emp_id) RELY DISABLE NOVALIDATE) AS SELECT employee_id, last_name, email FROM employees;
更新可能なビューの作成: 例
次の文は、employees
表内の事務員全員の更新可能なビューclerk
を作成します。従業員のID、姓、部門番号および職種はビューで参照でき、事務員の行のこれらの列のみを更新できます。
CREATE VIEW clerk AS SELECT employee_id, last_name, department_id, job_id FROM employees WHERE job_id = 'PU_CLERK' or job_id = 'SH_CLERK' or job_id = 'ST_CLERK';
このビューでは、購買係のjob_id
を購買マネージャ(PU_MAN
)に変更できます。
UPDATE clerk SET job_id = 'PU_MAN' WHERE employee_id = 118;
次の例は、同じビューをWITH
CHECK
OPTION
付きで作成します。新しい従業員が事務員ではない場合は、clerk
に新しい行を挿入できません。従業員のjob_id
を他の事務タイプに更新できますが、事務員以外のjob_id
の場合はビューがemployeesにアクセスできないため、正常に更新できません。
CREATE VIEW clerk AS SELECT employee_id, last_name, department_id, job_id FROM employees WHERE job_id = 'PU_CLERK' or job_id = 'SH_CLERK' or job_id = 'ST_CLERK' WITH CHECK OPTION;
結合ビューは、結合を含むビューの副問合せを持つビューです。副問合せの結合において、一意索引を持つ列が1列以上ある場合、結合ビューで1つの実表を変更できます。結合ビューの中の列が更新可能であるかどうかは、USER_UPDATABLE_COLUMNS
を問い合せることでわかります。たとえば:
CREATE VIEW locations_view AS SELECT d.department_id, d.department_name, l.location_id, l.city FROM departments d, locations l WHERE d.location_id = l.location_id; SELECT column_name, updatable FROM user_updatable_columns WHERE table_name = 'LOCATIONS_VIEW' ORDER BY column_name, updatable; COLUMN_NAME UPD ------------------------------ --- DEPARTMENT_ID YES DEPARTMENT_NAME YES LOCATION_ID NO CITY NO
前述の例では、locations
表のlocation_id
列に対する主キー索引は、locations_view
ビュー内で一意ではありません。そのため、locations
はキー保存表ではなく、その実表の列は更新できません。
INSERT INTO locations_view VALUES (999, 'Entertainment', 87, 'Roma'); INSERT INTO locations_view VALUES * ERROR at line 1: ORA-01776: cannot modify more than one base table through a join view
departments
表にマップするビュー内のすべての列に更新可能のマークが付けられていて、departments
の主キーがビューに保持されているため、departments
実表に対して、行の挿入、更新または削除を実行できます。
INSERT INTO locations_view (department_id, department_name) VALUES (999, 'Entertainment'); 1 row created.
ノート:
ビューを使用して表に挿入するには、NOT
NULL
列に対してDEFAULT
値を指定していないかぎり、結合内のすべての表のすべてのNOT
NULL
列がビューに含まれている必要があります。
関連項目:
結合ビューの更新の詳細は、『Oracle Database管理者ガイド』を参照してください。
読取り専用ビューの作成: 例
次の文は、oe.customers
表のcustomer_ro
という読取り専用ビューを作成します。顧客の姓、言語、掛貸限度額のみがこのビューで参照できます。
CREATE VIEW customer_ro (name, language, credit) AS SELECT cust_last_name, nls_language, credit_limit FROM customers WITH READ ONLY;
オブジェクト・ビューの作成: 例
次の例は、oc
スキーマ内でのinventory_typ
型の作成方法、およびその型を基にしたoc_inventories
ビューの作成方法を示しています。
CREATE TYPE inventory_typ OID '82A4AF6A4CD4656DE034080020E0EE3D' AS OBJECT ( product_id NUMBER(6) , warehouse warehouse_typ , quantity_on_hand NUMBER(8) ) ; / CREATE OR REPLACE VIEW oc_inventories OF inventory_typ WITH OBJECT OID (product_id) AS SELECT i.product_id, warehouse_typ(w.warehouse_id, w.warehouse_name, w.location_id), i.quantity_on_hand FROM inventories i, warehouses w WHERE i.warehouse_id=w.warehouse_id;
XMLType表のビューの作成: 例
次の例は、XMLType
表xwarehouses
(「例」で作成)の通常のビューを作成します。
CREATE VIEW warehouse_view AS SELECT VALUE(p) AS warehouse_xml FROM xwarehouses p;
このビューからは、次のように選択します。
SELECT e.warehouse_xml.getclobval() FROM warehouse_view e WHERE EXISTSNODE(warehouse_xml, '//Docks') =1;
オブジェクト・リレーショナル表に、XMLType
ビューを作成する場合もあります。次の例は、サンプル表oe.warehouses
内のXMLType
列warehouse_spec
と同様のオブジェクト・リレーショナル表を作成し、その表のXMLType
ビューを作成します。
CREATE TABLE warehouse_table ( WarehouseID NUMBER, Area NUMBER, Docks NUMBER, DockType VARCHAR2(100), WaterAccess VARCHAR2(10), RailAccess VARCHAR2(10), Parking VARCHAR2(20), VClearance NUMBER ); INSERT INTO warehouse_table VALUES(5, 103000,3,'Side Load','false','true','Lot',15); CREATE VIEW warehouse_view OF XMLTYPE XMLSCHEMA "http://www.example.com/xwarehouses.xsd" ELEMENT "Warehouse" WITH OBJECT ID (extract(OBJECT_VALUE, '/Warehouse/Area/text()').getnumberval()) AS SELECT XMLELEMENT("Warehouse", XMLFOREST(WarehouseID as "Building", area as "Area", docks as "Docks", docktype as "DockType", wateraccess as "WaterAccess", railaccess as "RailAccess", parking as "Parking", VClearance as "VClearance")) FROM warehouse_table;
このビューは、次のように問い合せます。
SELECT VALUE(e) FROM warehouse_view e;