3.20.1 CREATE VIEW(ビュー定義)
(1) 機能
ビュー表を定義します。
(2) 使用権限
(3) 形式
CREATE 〔READ ONLY〕 VIEW 〔認可識別子.〕表識別子 〔(列名〔,列名〕…)〕 AS 導出問合せ式 導出問合せ式::= 問合せ式本体 問合せ式本体::={問合せ指定 |(問合せ式本体) |問合せ式本体{UNION|EXCEPT}〔ALL〕 {問合せ指定|(問合せ式本体)}}
(4) オペランド
(a) 〔READ ONLY〕
定義するビュー表を読み込み専用にする場合に指定します。
(b) 〔認可識別子.〕表識別子〔(列名〔,列名〕…)〕
- 認可識別子
-
定義するビュー表の所有者となるユーザの認可識別子を指定します。
- 表識別子
-
定義するビュー表の名前を指定します。
定義するビュー表の所有者になるユーザが既に所有している表(実表及びビュー表)の中に同じ名前を指定しないでください。
- 列名
-
ビュー表を構成する列を指定します。
列名を省略した場合,次のようになります。
-
導出問合せ式に集合演算を指定しない場合,問合せ指定によって指定された導出表の各列の列名(AS 列名を指定している場合は,AS句で指定した列名)が,ビュー表を構成する各列の列名になります。
-
導出問合せ式に集合演算を指定した場合,導出問合せ式の1番目の問合せ指定によって指定された導出表の各列の列名(AS 列名を指定している場合は,AS句で指定した列名)が,ビュー表を構成する各列の列名になります。
ただし,導出問合せ式によって指定された導出表が,列名が同じである二つ以上の列を含む,又は名前のない列を含む場合は省略できません。
列名についての規則を次に示します。
-
導出表の列が次に示す項目から導き出された列で,AS列名を省略した場合,その列は名前のない列になります。
・スカラ演算
・関数呼出し
・集合関数
・定数
・USER値関数
・CURRENT_DATE値関数
・CURRENT_TIME値関数
・CURRENT_TIMESTAMP値関数
・コンポネント指定
-
同じ列名は指定できません。列名で指定する列の数は,導出問合せ式の結果で得られる導出表の列と同じ数にしてください。
-
列名で指定できる列の数の最大値は30,000個です。
-
(c) 導出問合せ式
ビュー表の定義内容を表す導出問合せ式を指定します。導出問合せ式については「問合せ式」を参照してください。
導出問合せ式についての規則を次に示します。
-
ビュー定義中の導出問合せ式では,選択式に〔表指定.〕ROWは指定できません。
-
ビュー定義中の導出問合せ式では,直接含まれるSELECT句に添字付きの繰返し列は指定できません。
-
導出問合せ式に直接含まれるSELECT句に*,又は表.*を指定しても,ビュー定義後にビュー表の基表に追加した列はビュー表には追加されません。
-
ビュー定義の導出問合せ式中には,実表及びビュー表を指定できます。また,ビュー表を基にして新しいビュー表も定義できます。
-
ビュー定義の導出問合せ式中では,埋込み変数,及び?パラメタは指定できません。
-
ビュー定義中の導出問合せ式では,次に示す値式は指定できません。
-
XMLコンストラクタ関数
-
SQL/XMLスカラ関数
-
SQL/XML述語
-
SQL/XML集合関数
-
-
ビュー定義中の導出問合せ式に,予備列を指定できません。
(5) 共通規則
-
ビュー表は,読み込み専用のビュー表と更新できるビュー表に分けられます。
読み込み専用のビュー表は行の挿入,更新,削除,及びカーソル宣言でのFOR UPDATE句の指定はできません。
読み込み専用のビュー表を次に示します。
-
ビュー定義文で,READ ONLYを指定して定義したビュー表
-
ビュー定義文で,最も外側の問合せ指定に対する表の結合,SELECT DISTINCT,GROUP BY句,HAVING句,又は集合関数を含むビュー表
-
ビュー定義文で,最も外側の問合せ指定のSELECT句に基の表の同一列を複数指定して定義したビュー表
-
ビュー定義文で,最も外側の問合せ指定のSELECT句に列指定以外の値式を含むビュー表
-
バージョン07-02より前に定義したビュー表のうち,ビュー定義文で,最も外側の問合せ指定のFROM句に指定した表と同じ表をFROM句に指定した副問合せを含むビュー表(FROM句に指定する表がビュー表の場合,ビュー表の基となる表も含む)
注 このビュー表を更新できるビュー表にするには,そのビュー表を削除してから,定義し直してください。
-
ビュー定義文で,最も外側の問合せ指定のFROM句に導出表を指定して定義したビュー表
-
ビュー定義文で集合演算を指定して定義したビュー表
また,上記以外のビュー表(読み込み専用でないビュー表)が更新できるビュー表です。
-
-
ビュー定義の導出問合せ式中に指定した表は,そのビュー表を構成する基の表です。ビュー定義の導出問合せ式に含まれるFROM句に指定した表は,そのビュー表を導き出すための操作対象の基になる表です。
-
ビュー定義の導出問合せ式中の,最も外側の問合せに含まれるFROM句に指定した表が,そのビュー表に対する操作の対象の基になる表です。
更新できるビュー表の所有者は,そのビュー表の操作の対象の基になる表に対して持つ,次のアクセス権限をそのまま引き継ぎます。
-
SELECT権限
-
INSERT権限
-
DELETE権限
-
UPDATE権限
読み込み専用のビュー表の所有者は,そのビュー表の操作の対象になる表の基になる表に対して持つSELECT権限だけを引き継ぎます。
また,すべて自分が所有する表から定義したビュー表の所有者はほかのユーザに対して自分の持つアクセス権限を与えたり,取り消したりできます。
-
-
ビュー表を使用して行の追加や更新をする場合,追加する行,又は更新後の行は,ビュー表定義時に導出問合せ式中で指定した探索条件を満足してもしなくてもかまいません。ただし,ビュー表定義時に指定した探索条件を満足しない行は,そのビュー表を使用して検索,更新,及び削除はできません。
-
ビュー表を構成する列の属性(データ型,データ長,非ナル値制約の有無,及び最大要素数)は,ビュー定義の導出問合せ式で指定した導出表の対応する列の属性と同じになります。
-
ビュー定義を実行する場合,そのビュー表の基になる表をあらかじめ定義してください。
-
ビュー定義文は,OLTP下のX/Openに従ったUAPから指定できません。
-
文字列表現された日付,時刻,又は時刻印の定数,及び10進数で表現された日間隔や時間隔の定数から定義したビュー表の列は,日付データ,時刻データ,時刻印データ,日間隔データ,及び時間隔データが要求される場所で指定しても,その列のデータ型で扱い,それぞれの要求されるデータ型には変換されません。ただし,スカラ関数DATE,TIME,及びTIMESTAMPの引数に指定した場合を除きます。
(例)
UPDATE T1 SET C1=(SELECT VC2 FROM V1 WHERE VC1='E') …指定できません。
(C1は日付データ型の列,VC2は日付の文字列で表現された定数から定義したVARCHAR(10)の列)
-
ビュー定義中の導出問合せ式では,直接含まれるSELECT句に添字付きの繰返し列は指定できません。
-
ビュー定義中の導出問合せ式では,最も外側の問合せ指定の選択式にCASE式を指定した場合,そのCASE式の探索条件には繰返し列を指定できません。
-
ビュー定義の導出問合せ式の選択式には,次の項目は指定できません。
-
WRITE指定
-
GET_JAVA_STORED_ROUTINE_SOURCE指定
-
ウィンドウ関数
-
-
関数呼出しを指定して定義したビュー表を操作する場合,呼び出す候補となるユーザ定義関数は,そのビュー表の定義よりも前に定義したユーザ定義関数だけとなります。
-
SQLオブジェクト移行ユティリティで,32ビットモードから64ビットモードのHiRDBへ移行した場合,次に示す条件をすべて満たすビュー表は移行前後で検索結果が異なることがあります。
(1) ビュー定義の導出問合せ式にユーザ定義関数を指定して,ビュー表を定義する
(2) (1)のビュー表を定義した後,(1)の導出問合せ式に指定したユーザ定義関数に対して,呼出し候補となるユーザ定義関数を定義する
(3) (2)で定義したユーザ定義関数は,(1)の導出問合せ式に指定したユーザ定義関数よりも呼出し優先度が高い
上記の(1)〜(3)の後,SQLオブジェクト移行ユティリティで,32ビットモードから64ビットモードのHiRDBへ移行する
ユーザ定義関数の呼出し決定規則については,「呼び出す関数の決定規則と結果のデータ型」を参照してください。
(6) 使用例
-
在庫表(ZAIKO)から商品名(SNAME)がソックスの行で商品コード(SCODE),在庫量(ZSURYO),単価(TANKA)の列で構成されるビュー表(VZAIKO1)を定義します。なお,列の並びは,商品コード,在庫量,単価の順とします。
CREATE VIEW VZAIKO1 AS SELECT SCODE,ZSURYO,TANKA FROM ZAIKO WHERE SNAME = N'ソックス'
-
在庫表(ZAIKO)と同じ構成のビュー表(VZAIKO2)を読み込み専用として定義します。
CREATE READ ONLY VIEW VZAIKO2 AS SELECT * FROM ZAIKO