CREATE VIEW

CREATE VIEW ステートメントは、現行サーバーに 1 つ以上の表またはビ ューに関するビューを作成します。

呼び出し

このステートメントは、アプリケーション・プログラムに組み込むことができ、また対話式に呼び出すこともできます。 これは、動的に準備できる実行可能ステートメントです。

権限

このステートメントの権限 ID が保持する特権には、少なくとも以下の 1 つ が含まれていなければなりません。

このステートメントの権限 ID が保持する特権には、少なくとも以下の 1 つ が含まれていなければなりません。

  • 次のシステム権限
    • 論理ファイル作成 (CRTLF) CL コマンドに対する *USE 権限
    • データ・ディクショナリーに対する *CHANGE 権限。ただし 、ビューが作成されるライブラリーが、データ・ディクショナリーを持つ SQL スキーマの場合。
  • データベース管理者権限

このステートメントの権限 ID によって保持される特権には、少なくとも次の 1 つが含まれていなければなりません。

  • 全選択を介して直接的に参照されたり、あるいは、全選択で 参照されるビューを介して間接的に参照されるそれぞれの表とビューに対す る次の特権。
    • 表やビューに対する SELECT 特権、および
    • 表やビューが入っているライブラリーに対する *EXECUTE システム権限
  • データベース管理者権限

既存のビューに置き換えるには、ステートメントの権限 ID が保持する特権に、次のうち少なくともいずれか 1 つを含める必要があります。

  • 次のシステム権限
    • ビューに対する *OBJMGT のシステム権限
    • このビューを削除するために必要な全権限
  • データベース管理者権限

SQL 特権に対応するシステム権限については、『表またはビューへの権限を検査する際の対応するシステム権限』および『特殊タイプへの権限を検査する際の対応するシステム権限』を参照してください。

構文

構文図を読む構文図をスキップする
>>-CREATE--+------------+--+-----------+--VIEW--view-name--+-------------------------------------------+-->
           '-OR REPLACE-'  '-RECURSIVE-'                   '-FOR SYSTEM NAME--system-object-identifier-'   

>--+----------------------------------------------------------------+-->
   |    .-,----------------------------------------------------.    |   
   |    V                                                      |    |   
   '-(----column-name--+-------------------------------------+-+--)-'   
                       |      .-COLUMN-.                     |          
                       '-FOR--+--------+--system-column-name-'          

>--AS--+-----------------------------------+--fullselect-------->
       |       .-,-----------------------. |               
       |       V                         | |               
       '-WITH----common-table-expression-+-'               

>--+----------------------------------+------------------------->
   |       .-CASCADED-.               |   
   '-WITH--+----------+--CHECK OPTION-'   
           '-LOCAL----'                   

>--+---------------------+-------------------------------------><
   '-RCDFMT--format-name-'   

説明

OR REPLACE
現行サーバーにこのビューの定義が存在する場合に、その定義を置き換える、という動作を指定します。実際には、カタログで既存の定義を削除してから新しい定義に置き換える、という動作になりますが、例外として、このビューに対して与えられていた特権は影響を受けません。既存のオブジェクトは論理ファイルであってはなりません。 現行サーバーにこのビューの定義が存在しなければ、このオプションは無視されます。
RECURSIVE
ビューが潜在的に反復的であることを示します。

FROM 文節内で、ビューの全選択 がビュー自身に対する参照を含んでいる場合は、そのビューは反復ビュー です。 反復を使用するビューは、部品表 (BOM)、予約システム、ネットワーク計画のようなアプリケーションをサポートする場合に役立ちます。

反復ビュー に適用される以下の制約事項は、反復共通表式での制約事項と似ています。

  • 列名 のリストは、全選択の結果列に既に名前が付けられていない限り、ビュー名 の後に指定しなければなりません。
  • UNION ALL セット演算子を指定しなければなりません。
  • 最初の和集合の最初の全選択 (初期化全選択) の FROM 文節には、ビュー 自身の参照を含めてはなりません。
  • 反復サイクルの一部である各全選択には、集約関数、GROUP BY 文節、または HAVING 文節を含めてはなりません。
  • 各全選択の FROM 文節に、反復サイクルの一部であるビューの参照を 1 つまで組み込むことができます。
  • 共通表式 で定義されている表を、共通表式 を定義する全選択の副照会で参照することはできません。
  • 共通表式が右オペランドの場合、LEFT OUTER JOIN および FULL OUTER JOIN は使用できません。 共通表式が左オペランドの場合、RIGHT OUTER JOIN および FULL OUTER JOIN は使用できません。

ビューの列名が反復全選択で参照される場合、結果列の属性は、結果列に関する規則を使用して決定します。 詳しくは、結果のデータ・タイプに関する規則を参照してください。

照会が以下のいずれかを指定する場合、反復ビューは許可されません。

  • 分散表
  • 読み取りトリガーを指定する表
  • 全選択で直接または間接的に参照される表は、DDS 作成の論理ファイルであってはなりません。
  • 複数の物理ファイル・メンバー上に構築された論理ファイル
view-name
ビューの名前を指定します。暗黙的または明示的修飾子も含め、この名前で、現行サーバーに既に存在している別名、ファイル、索引、表、またはビューと同じ名前にすることはできません。

SQL 名が指定されている場合、ビューは、暗黙的または明示的修飾子で指定 しているスキーマ内に作成されます。

システム名が指定されている場合、ビューは、修飾子で指定しているスキ ーマ内に作成されます。 修飾されていない場合、およびデフォルトのスキーマが無い場合、ビュー名は、最初の FROM 文節 (任意の共通表式またはネストされた表式の FROM 文節を含む) 上に指定されている、最初の表と同一のスキーマ内に作成されます。 表が全選択で参照されない場合、ビューは最初のユーザー定義表関数と同一のスキーマ内に作成されます。 表またはユーザー定義表関数が全選択で参照されない場合は、現行ライブラリー (*CURLIB) が使用されます。

ビュー名が有効なシステム名でなく、FOR SYSTEM NAME 節が使用されていない場合、DB2® for i がシステム名を生成します。名前の生成に関する規則については、表名の生成の規則を参照してください。

FOR SYSTEM NAME system-object-identifier
ビューのシステム・オブジェクト ID を示します。システム・オブジェクト ID は、現行サーバーに 既に存在する表、ビュー、別名、または索引と同一であってはなりません。 システム・オブジェクト ID は、非修飾システム ID でなければなりません。

システム・オブジェクト ID が 指定される場合、ビュー名 は有効なシステム・オブジェクト名であってはなりません。

(column-name, … )
このビューの列の名前を指定します。列名のリストを指定 する場合は、そのリストは、全選択の結果表にある列の数と同じ数の列名で 構成されている必要があります。それぞれの列名 およびシステム列名 は固有でなければならず、修飾は付けられません。 列名のリストを指定しなかった場合は、ビューの列は、全選択 の結果表の列名および列のシステム名を継承します。

副選択の結果表に、重複する列名、重複するシステム列名、または 名前なしの列がある場合は、列名 (およびシステム列名) のリストを指定す る必要があります。 名前が指定されない列についての詳細は、結果列の名前を参照してください。

FOR COLUMN システム列名
列の IBM® i 名を指定します。ビューの複数の列またはビューの列名に、同じ名前を使用してはなりません。

システム列名が指定されず、また列名が有効なシステム列名でない場合には、システム列名が生成されます。 システム列名の生成方法に関する詳細については、列名の生成の規則を参照してください。

AS
ビューを定義します。
WITH common-table-expression
後に続く全選択指定で使用するための共通表式を定義します。 共通表式については、共通表式を参照してください。
fullselect
ビューを定義します。ビューは、常に、全選択が実行された場合に結 果として生じる行から構成されます。

全選択 は変数を参照しては なりませんが、グローバル変数を参照することはできます。

ビューで許可される列の最大数は 8000 です。 この数は、列名の長さ、および WHERE 文節の長さによっても減少します。 ビューで許可される基本表の最大数は 256 です。

全選択 の説明については、全選択を参照してください。

共通表式 は、後に続く全選択 で使用するための共通表式を定義します。 詳しくは、共通表式を参照してください。

スキーマ QTEMP でビューを作成する場合を除き、fullselect で宣言済み一時表を参照することはできません。

common-table-expression 内で許可された場合を除き、ORDER BY 文節と FETCH FIRST 文節を指定することはできません。変更の始まりOFFSET 文節は指定できません。変更の終わり

WITH CASCADED CHECK OPTION または WITH LOCAL CHECK OPTION
このビューを介して挿入または更新される行は、すべてがこのビュー の定義に適合しなければならないことを指定します。 このビューの定義に適合しない行は、このビューを使用して検索することができない行です。

以下の場合は、CHECK OPTION は指定できません。

  • ビューが読み取り専用である。
  • ビューの定義に、ビューの外部選択リストのスカラー全選択以外の副照会が含まれている。
  • ビューの定義に、ビューの外部選択リスト以外の非決定的、MODIFIES SQL DATA、または EXTERNAL ACTION 関数が含まれている。
  • ビューの定義に、ビューの外部選択リスト以外の特殊レジスターが含まれている。
  • ビューが別のビューを参照し、そのビューは INSTEAD OF トリガーを持つ。
  • ビューが反復的である。

挿入を許さない更新可能ビューに関して CHECK OPTION を指定した場合 は、検査オプションは更新のみに適用されます。

CHECK OPTION を指定しない場合は、ビューの定義は、そのビューを使用するいずれの挿入または更新操作のチェックにも使用されません。ただし、そのビューが CHECK OPTION を伴う他のビューに直接または間接に従属している場合には、挿入または更新の操作の過程でなおチェックが行われます。そのビューの定義は使用されないので、そのビューの定義に適合しない行がそのビューを介して挿入、または更新されることがあります。

CHECK OPTION 文節の 2 つの形式 (CASCADED と LOCAL) の違いが意味を持つのは、ビューが別のビューに依存している場合に限られます。デフォルトは CASCADED です。あるビューの定義が直接的または間接的に別のビューに基づいている場合、その基礎になっているビューのことを基本ビュー といいます。

CASCADED
ビュー V に関する WITH CASCADED CHECK OPTION は、V に直接または間接的に従属し ている更新可能などのビューにも継承されます。したがって、更新可能なビ ューが V 上に定義されている場合は、そのビューに対して WITH CHECK OPTION が指定されていなくても、V に関する検査オプションはそのビューに も適用されます。 例えば、次のような更新可能なビューを想定します。
CREATE VIEW V1 AS SELECT COL1 FROM T1 WHERE COL1 > 10

CREATE VIEW V2 AS SELECT COL1 FROM V1 WITH CHECK OPTION

CREATE VIEW V3 AS SELECT COL1 FROM V2 WHERE COL1 < 100
SQL ステートメント 結果の記述
INSERT INTO V1 VALUES(5) V1 には CHECK OPTION 文節の指定がなく、 また CHECK OPTION 文節の指定を持つ他のビューに従属していないので、正しく実行されます。
INSERT INTO V2 VALUES(5) 挿入された行が、暗黙的に V2 の定義の一部である V1 の検索条件に適合していないため、エラーが生じます。
INSERT INTO V3 VALUES(5) V3 が CHECK OPTION 文節に従属しており、 挿入された行が V2 の定義に適合していないため、エラーが生じます。
INSERT INTO V3 VALUES(200) V3 の定義には適合していなくても (V3 にはビュー CHECK OPTION 文節の指定がない)、 V2 の定義には適合しているので (ビュー CHECK OPTION 文節の指定がある)、正常に実行されます。
LOCAL
WITH LOCAL CHECK OPTION は、次の点を除いて、WITH CASCADED CHECK OPTION と同等です。すなわち、WITH LOCAL CHECK OPTION を指定して定義さ れたビューでは、行の更新によってその行がそのビューの定義に適合しなく なる場合でも、なおその行の更新が可能である点が異なります。 これは、そのようなビューが、 その定義に WITH CASCADED CHECK OPTION または WITH LOCAL CHECK OPTION のどちらの文節も指定されていないビューに直接、 または間接に従属している場合にのみ起こります。

WITH LOCAL CHECK OPTION は、行の挿入または更新の時点で、 以下の基本的なビューの検索条件がチェックされることを指定します。

  • WITH LOCAL CHECK OPTION を指定するビュー
  • WITH CASCADED CHECK OPTION を指定するビュー
  • WITH CASCADED CHECK OPTION を指定するビューの基礎となるすべてのビュー

これに対して、WITH CASCADED CHECK OPTION は、行の挿入または更新の時点で、 すべての基礎となるビューの検索条件がチェックされることを指定します。

CASCADED と LOCAL の相違点を例によって示します。 次のような更新可能なビューについて考えます。この場合の x と y は、LOCAL か CASCADED のどちらかを表します。

  V1 は表 T0 で定義されている。
  V2 は V1 WITH x CHECK OPTION を指定して定義されている。
  V3 は V2 で定義されている。
  V4 は V3 WITH y CHECK OPTION を指定して定義されている。
  V5 は V4 で定義されている。

次の表は、INSERT または UPDATE の操作中に、どのビューの検索条件がチェックされるかを示しています。

表 1. INSERT および UPDATE の過程でその検索条件がチェックされるビュー
INSERT または UPDATE で使用されるビュー x = LOCAL

y = LOCAL

x = CASCADED

y = CASCADED

x = LOCAL

y = CASCADED

x = CASCADED

y = LOCAL

V1 なし なし なし なし
V2 V2 V2 V1 V2 V2 V1
V3 V2 V2 V1 V2 V2 V1
V4 V4 V2 V4 V3 V2 V1 V4 V3 V2 V1 V4 V2 V1
V5 V4 V2 V4 V3 V2 V1 V4 V3 V2 V1 V4 V2 V1
RCDFMT format-name
ビューの IBM i レコード・フォーマット名を指定する非修飾名です。format-name は、システム ID です。

レコード・フォーマット名が指定されない場合、format-name は、ビューの system-object-name と同一のものになります。

ビューの所有権: SQL 名が指定されている場合、

  • 作成したビューが入れられるスキーマと同じ名前のユーザー・プロファイルが存在する場合、ビューの所有者 はそのユーザー・プロファイルです。
  • その他の場合は、ビューの所有者 は、この ステートメントを実行しているスレッドのユーザー・プロファイルまたは グループ・ユーザー・プロファイルです。

システム名を指定した場合は、ビューの所有者 は、この ステートメントを実行しているスレッドのユーザー・プロファイルまたはグループ・ユーザー・プロファイルです。

ビューの権限 : SQL 名を使用する場合は、ビュー は、*PUBLIC に対するシステム権限 *EXCLUDE を使用して作成されます。 システム名を使用する場合、ビューは、スキーマの作成権限 (CRTAUT) パラ メーターによって決められる *PUBLIC に対する権限を使用して作成されます。

ビューの所有者がグループ・プロファイルのメンバー (GRPPRF キーワード) であり、グループ権限が指定されている (GRPAUT キーワード) 場合は、そのグループ・プロファイルにも、そのビューに対する権限が与えられます。

所有者には常に、そのビューに関する WITH GRANT OPTION 付きの SELECT 特権とそのビューを削除する権限が与えられます。

また、所有者はそのビューについての INSERT、UPDATE、および DELETE 特権も入手することがあります。 ビューが読み取り専用でない場合、全選択の最初の FROM 文節で識別された 表やビューに対して所有者が持つ特権と同じ特権を新たなビューについても 獲得することになります。 そのような特権が認可できるのは、それらの元となっている特権も認可できる場合だけに限られます。

REPLACE の規則: REPLACE によってビューを再作成する場合は、以下のようになります。
  • 既存のコメントまたはラベルは破棄されます。
  • 権限を持つユーザーは維持されます。オブジェクト所有者は変更される可能性があります。
  • 現在のジャーナル監査は保持されます。ただし、他のオブジェクトと異なり、ビューの REPLACE では、ZC (オブジェクト変更) ジャーナル監査項目が生成されます。
  • ビューに定義された INSTEAD OF トリガーは 除去されます (ビューを参照するトリガーは除去されません)。
  • そのビューに依存するビューとマテリアライズ照会表は再作成されます (ただし、可能な場合に限られます)。従属するビューまたはマテリアライズ照会表を再作成できない場合は、エラーが戻されます。

削除可能ビュー: 削除操作の INSTEAD OF トリガーがビューに定義されている場合、または次のいずれかが当てはまる場合、ビューは削除可能 です。

  • 外側の全選択が指定しているのは、カタログ表またはカタログ・ビューではない 1 つの基本表または削除可能ビューのみ である。それは、ネストされた表の式、表関数変更の始まりおよび FOR SYSTEM_TIME 文節を使用した表変更の終わりであってはならない。
  • 外側の全選択に VALUES 文節が含まれていない。
  • 外側の全選択に、GROUP BY 文節または HAVING 文節が含まれていない。
  • 外側の全選択の選択リストに集約関数が含まれていない。
  • 外側の全選択に UNION 演算子、UNION ALL 演算子、EXCEPT 演算子、または INTERSECT 演算子が含まれていない。
  • 外側の全選択に DISTINCT 文節が含まれていない。

更新可能ビュー: 更新操作の INSTEAD OF トリガーがビューに定義されている場合、または次のいずれかが当てはまる場合、ビューは更新可能 です。

  • 削除可能なビューである (削除操作の INSTEAD OF トリガーとは無関係)。
  • ビューの少なくとも 1 つが更新可能である。

ビューに更新操作用 INSTEAD OF トリガーが定義されている場合、または副選択 の対応する結果列が表の列、または別のビューの更新可能な列からのみ取り出される場合、 ビューの列は 更新可能 です (すなわち、結果の列は、演算子、スカラー関数、定数、 またはそれ自体がそのような式から取り出された列を含む式から取り出される列であってはなりません)。

挿入可能ビュー: ビューに INSTEAD OF トリガーが定義されている場合、またはビューの少なくとも 1 つの列が更新可能である場合、ビューは挿入可能 です。

読み取り専用のビュー: 削除可能でないビューは読み取り専用 です。

読み取り専用ビューに対して INSERT、UPDATE、または DELETE ステートメントを実行することはできません。

変更の始まり

テンポラル・サポート用の特殊レジスター: 特殊レジスター CURRENT TEMPORAL SYSTEM_TIME の値は、ビューを定義する照会式には、そのビューが定義されている限り影響を及ぼしません。 SQL ステートメントでビューを使用する場合、SYSTIME オプションの値が YES に設定されていれば、 その SQL ステートメントを処理しているセッションの CURRENT TEMPORAL SYSTEM_TIME 特殊レジスター の値が、ビューに適用されます。

変更の終わり

非修飾表名: CREATE VIEW ステートメントが非修飾表名を参照する場合、実際に参照する表を決定するために、次の規則が適用されます。

  • 非修飾名が全選択 で指定された 1 つ以上の共通表式表 ID に対応する場合、その名前は有効範囲が最も内側の共通表式を示します。
  • それ以外の場合、名前は永続表、一時表、またはデフォルトのスキーマに存在するビューを識別します。

暗黙的な隠し列に関する考慮事項: 暗黙的な隠し列として定義された基本表の列が、全選択の結果表に含まれることがあります。この状態が発生するのは、暗黙的な非表示列がビュー定義の全選択で明示的に参照される場合です。ただし、ビューの対応する列は、暗黙的な隠し列としての属性を継承しません。 ビューの列を非表示として定義することはできません。

照合順序: ビューは、CREATE VIEW ステートメントの実行時に有効な照合順序に従って作成されます。 ビューの照合順序は、そのビューの全選択における SBCS データおよび混合データに関連するすべての比較に適用されます。照会にビューが含まれる場合は、そのビューの全選択から中間結果表が作成されます。 照会を実行するときに有効な照合順序が、その照会で指定される選択すべてに適用されます。

ビューの属性 : ビューは、キーのない論理ファイルとして作成されます。 ビューが作成される場合、ファイル待ち時間とレコード待ち時間の属性は、論理ファイル作成 (CRTLF) コマンドの WAITFILE キーワードと WAITRCD キーワード上に指定されたデフォルト値に設定されます。

日時の結果列に使用される日時形式は ISO です。

分散表を介して作成されるビューは、その表が配布されるすべてのシステム上で作成されます。 ビューが複数の分散表に作成され、その表が同一のノード・グループを使用して配布されない場合は、そのビューは、CREATE VIEW ステートメントを実行するシステムにのみ作成されます。 分散表の詳細については、「DB2 UDB for iSeries マルチ・システム」トピック集を参照してください。

ID 列および行変更タイム・スタンプ列: ビューの 列が ID 列または行変更タイム・スタンプ列であると見なされるのは、 ビュー定義の全選択の中の対応する列のエレメントが、表の ID 列または行変更タイム・スタンプ列の 名前であるか、基本表の ID 列または行変更タイム・スタンプ列の名前に直接的または間接的にマップするビューの列の 名前である場合です。その他の場合は、ビューの列は ID プロパティーまたは行変更タイム・スタンプ・プロパティー を取得しません。例えば、次のようになります。

  • ビュー定義の選択リストに、ID 列の名前の複数のインスタンスが 含まれている (つまり同じ列を複数回選択している) 場合。
  • ビュー定義に結合が含まれている場合。
  • ビュー定義の中の列のいずれかに、ID 列を参照する式が含まれている場合。
  • ビュー定義に UNION または INTERSECT が含まれている場合。

例 1: C 表 PROJECT をもとに、MA_PROJ という名前のビューを作成します。この表には PROJNO (プロジェクト番号) が「MA」という文字で始まっている行だけを入れます。

CREATE VIEW MA_PROJ
  AS SELECT * FROM PROJECT
        WHERE SUBSTR(PROJNO, 1, 2) = 'MA'

例 2: 例 1 と同じようにビューを作成します。 ただし、このビューでは、PROJNO (プロジェクト番号)、PROJNAME (プロジェクト名)、および RESPEMP (プロジェクトに関与している従業員) の各列だけを選択します。

CREATE VIEW MA_PROJ
  AS SELECT PROJNO, PROJNAME, RESPEMP FROM PROJECT
       WHERE SUBSTR(PROJNO, 1, 2) = 'MA'

例 3: 例 2 と同様のビューを作成します。ただし、ビューの中でプロジェクトの責任者の列を IN_CHARGE と呼びます。

CREATE VIEW MA_PROJ (PROJNO, PROJNAME, IN_CHARGE)
  AS SELECT PROJNO, PROJNAME, RESPEMP FROM PROJECT
       WHERE SUBSTR(PROJNO, 1, 2) = 'MA'
注: 列名を 1 つだけ変更する場合でも、MA_PROJ の後の括弧内に、ビューを構成する 3 つの列の名前をすべて指定しなければなりません。

例 4: PRJ_LEADER という名前のビューを作成します。このビューには、PROJECT 表 の最初の 4 つの列 (PROJNO, PROJNAME, DEPTNO, RESPEMP) と、そのプロジ ェクトの責任者 (RESPEMP) の名字 (LASTNAME) を合わせて入れます。名前は、表 EMPLOYEE 内の EMPNO と表 PROJECT 内の RESEMP を突き 合わせることによって、表 EMPLOYEE から取得しています。

CREATE VIEW PRJ_LEADER
  AS SELECT PROJNO, PROJNAME, DEPTNO, RESPEMP, LASTNAME
       FROM PROJECT, EMPLOYEE
       WHERE RESPEMP = EMPNO

例 5: 例 4 と同じようにビューを作成します。 ただし、このビューには、PROJNO、PROJNAME、 DEPTNO、RESEMP、および LASTNAME の各列に加えて、責任者の給与総額 (SALARY + BONUS +COMM) を入れます。 さらに、このビューでは、PRSTAFF (平均人員数) が 1 より大きいプロジェクトだけを選択しています。

CREATE VIEW PRJ_LEADER (PROJNO, PROJNAME, DEPTNO, RESPEMP, LASTNAME, TOTAL_PAY)
  AS SELECT PROJNO, PROJNAME, DEPTNO, RESPEMP, LASTNAME, SALARY+BONUS+COMM
       FROM PROJECT, EMPLOYEE
       WHERE RESPEMP = EMPNO AND PRSTAFF > 1

例 6: 共通表式と同様の結果を戻す反復ビューを作成します (例 1: 単一レベルの部品展開 を参照)。

   CREATE RECURSIVE VIEW RPL (PART, SUBPART, QUANTITY) AS
           SELECT ROOT.PART, ROOT.SUBPART, ROOT.QUANTITY
              FROM PARTLIST ROOT
              WHERE ROOT.PART = '01'
          UNION ALL
           SELECT CHILD.PART, CHILD.SUBPART, CHILD.QUANTITY
              FROM RPL PARENT, PARTLIST CHILD
              WHERE PARENT.SUBPART = CHILD.PART

   SELECT DISTINCT *
   FROMRPL
   ORDER BY PART, SUBPART, QUANTITY