日本語PDF

CREATE VIEW

目的

CREATE VIEW文を使用すると、ビューを定義できます。ビューとは、1つ以上の表またはビューをベースとした論理表です。ビュー自体にはデータは含まれていません。ビューのベースとなる表は、実表と呼ばれます。

LOB、オブジェクト型、REFデータ型、ネストした表またはVARRAY型をサポートするオブジェクト・ビューまたはリレーショナル・ビューを、既存のビュー・メカニズムで作成することもできます。オブジェクト・ビューとは、ユーザー定義型のビューのことで、ビューの各行に、それぞれが一意のオブジェクト識別子を持つオブジェクトが含まれます。

XMLTypeビューも作成できます。このビューは、オブジェクト・ビューと似ていますが、XMLTypeのXMLスキーマベースの表のデータを表示します。

関連項目:

前提条件

自分のスキーマ内にビューを作成する場合は、CREATE VIEWシステム権限が必要です。他のユーザーのスキーマ内にビューを作成する場合は、CREATE ANY VIEWシステム権限が必要です。

サブビューを作成する場合は、UNDER ANY VIEWシステム権限またはスーパービューに対するUNDERオブジェクト権限が必要です。

ビューが含まれているスキーマの所有者は、そのビューの基礎となっているすべての表またはビューに対する行の選択(READまたはSELECT権限)、挿入、更新または削除の権限が必要です。また、所有者には、これらの権限がロールを介してではなく、直接付与されている必要があります。

オブジェクト・ビューの作成時にオブジェクト型の基本コンストラクタ・メソッドを使用する場合、次のいずれかの条件を満たしている必要があります。

  • オブジェクト型が作成対象のビューと同じスキーマに属している。

  • EXECUTE ANY TYPEシステム権限を持っている。

  • そのオブジェクト型に対するEXECUTEオブジェクト権限を持っている。

関連項目:

作成するビューの基礎となる表またはビューに対して、ビューの所有者に必要な権限の詳細は、「SELECT」「INSERT」「UPDATE」および「DELETE」を参照してください。

構文

XMLType_view_clause::=

XMLSchema_spec::=

subquery_restriction_clause::=

セマンティクス

OR REPLACE

OR REPLACEを指定すると、既存のビューを再作成できます。この句を使用した場合、以前に付与されたオブジェクト権限を削除、再作成、再付与しなくても、既存のビュー定義を変更できます。

従来型のビューを再作成した場合、そのビューで定義されたINSTEAD OFトリガーは削除されます。エディショニング・ビューを再作成した場合、エディショニング・ビューで定義されたDMLトリガーは保持されます。ただし、エディショニング・ビューの変更によってコンパイルできない場合(たとえば、トリガー定義で参照されるエディショニング・ビュー列を削除した場合など)は、これらのトリガーを永続的に無効にできます。

すべてのマテリアライズド・ビューがviewに依存している場合、そのマテリアライズド・ビューにはUNUSABLEというマークが付けられ、それらが再利用可能になるようにリストアする場合は、完全なリフレッシュが必要になります。無効なマテリアライズド・ビューはクエリー・リライトで使用されることはなく、また、再コンパイルされるまでリフレッシュされません。

従来型のビューからエディショニング・ビューに、またはエディショニング・ビューから従来型のビューに置き換えることはできません。エディショニング・ビューの詳細は、『Oracle Database開発ガイド』を参照してください。

関連項目:

FORCE

FORCEを指定すると、ビューの実表または参照するオブジェクト型が存在しているか、またはそのビューを含むスキーマの所有者が、それらの表やオブジェクト型に対する権限を持っているかにかかわらず、ビューを作成できます。SELECTINSERTUPDATEまたはDELETE文をビューに対して発行する場合、これらの条件を満たしている必要があります。

ビュー定義が制約を含む場合、実表または参照するオブジェクト型が存在しないと、CREATE VIEW ... FORCEは正常に実行されません。また、ビュー定義で存在しない制約が指定される場合も、CREATE VIEW ... FORCEは正常に実行されません。

NO FORCE

NOFORCEを指定すると、実表が存在し、ビューを含むスキーマの所有者がその実表に対する権限を持っている場合のみ、ビューを作成できます。これはデフォルトです。

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_clauseDISTINCTまたはUNIQUEwhere_clausehierarchical_query_clausegroup_by_clauseHAVING条件、model_clause、または集合演算子(UNIONINTERSECTまたはMINUS)。

関連項目:

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です。

従来型のビューを作成する場合は、METADATADATAEXTENDED DATAまたはNONEを指定できます。

オブジェクト・ビューまたはXMLTYPEビューを作成する場合は、METADATAまたはNONEのみを指定できます。

ビューの共有属性は、作成後は変更できません。

関連項目:

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を使用すると、オブジェクト型にビューを定義できます。

OF type_name

この句を使用すると、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つのみ作成できます。

関連項目:

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句を指定して、オブジェクト・ビューを作成できます。

関連項目:

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句を使用すると、ビューで参照されるファンクションをビューの実行者権限で実行するか、ビューの定義者権限で実行するかを指定できます。

CURRENT_USER

BEQUEATH CURRENT_USERを指定すると、ビューで参照されるファンクションは、次の条件のいずれかが満たされているときに、ビューの実行者権限で実行されます。

  • ビューの所有者が、実行ユーザーに対するINHERIT PRIVILEGESオブジェクト権限を所持している。

  • ビューの所有者が、INHERIT ANY PRIVILEGESシステム権限を所持している。

ビューの問合せがIDまたは権限に影響を受けるSQLファンクションを実行する場合や、実行者権限のPL/SQLまたはJavaファンクションを実行する場合、その操作の実行範囲内での現在のスキーマ、現在のユーザー、およびその時点で有効にされるロールは、ビューの所有者から継承されるのではなく、問合せを実行したユーザーの環境から継承されます。

この句が、ビュー自体を実行者権限オブジェクトに変換することはありません。ビュー内での名前解決は、引き続きビューの所有者のスキーマを使用して処理され、ビューの権限チェックは、ビューの所有者の権限で実行されます。

DEFINER

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疑似列を選択できません。

  • 副問合せでROWIDROWNUMまたはLEVELの各疑似列を選択する場合、そのビュー副問合せには列の別名が必要です。

  • 副問合せでアスタリスク(*)を使用して表のすべての列を選択し、後でその表に新しい列を追加する場合、CREATE OR REPLACE VIEW文を発行してビューを再作成するまで、追加した列はそのビューに含まれません。

  • オブジェクト・ビューの場合、副問合せのSELECT構文のリスト内の要素数は、そのオブジェクト型の最上位属性数と同じである必要があります。それぞれの選択要素のデータ型は、対応する最上位属性と同じである必要があります。

  • SAMPLE句は指定できません。

これらの制限は、マテリアライズド・ビューにも適用されます。

更新可能なビューのノート

次のノートは、更新可能なビューに適用されます。

更新可能なビューとは、実表の行を挿入、更新または削除できるビューです。更新可能なビューを作成するか、またはビューにINSTEAD OFトリガーを作成して更新可能にすることができます。

更新可能なビューの列を更新する方法を確認するには、USER_UPDATABLE_COLUMNSデータ・ディクショナリ・ビューを問い合せます。このビューで表示される情報は、更新可能なビューのみに意味があります。ビューを更新可能にするには、次の条件が満たされている必要があります。

  • ビューの各列は、単一表の列にマップする必要があります。たとえば、ビューの列がTABLE句の出力にマップする場合(コレクション・ネスト解除)、ビューは更新可能ではありません。

  • ビューには、次の構造体が含まれていない必要があります。

    • 集合演算子
    • DISTINCT演算子
    • 集計ファンクションまたは分析ファンクション
    • GROUP BYORDER BYMODELCONNECT 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句に指定された最初の表から削除されます。

関連項目:

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_Cnという形式の名前が自動的に割り当てられます。この場合のnは、その制約名をデータベース内で一意の名前にする整数です。

ノート:

表にWITH CHECK OPTIONを指定すると、挿入および更新処理の結果、表を定義する副問合せによって選択可能な表が戻されることが保証されます。ビューでは、次の場合、WITH CHECK OPTIONを指定してもこれらの保証はされません。

  • 対象のビュー、または対象のビューの基礎となるビューを定義する問合せ内に、副問合せが含まれている場合。

  • INSERTUPDATEまたは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表のビューの作成: 例

次の例は、XMLTypexwarehouses (「例」で作成)の通常のビューを作成します。

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ビューの作成: 例

オブジェクト・リレーショナル表に、XMLTypeビューを作成する場合もあります。次の例は、サンプル表oe.warehouses内のXMLTypewarehouse_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;