ビューを作成します。
Synopsis
CREATE VIEW view-name (column-commalist) AS select-statement WITH READ ONLY

CREATE VIEW view-name (column-commalist) AS select-statement WITH [level] CHECK OPTION
引数
view-name 作成するビュー名。名前付け規約はテーブル名と同じです。ビュー名は修飾 (schema.viewname)、未修飾のどちらでもかまいません。同じスキーマ内では、テーブルとビューに同じ名前を使用することはできません。
column-commalist オプション — ビューを構成する列名。指定する場合、このリストは括弧で囲み、リスト内の項目はコンマで区切ります。
AS select-statement ビューを定義する SELECT 文。
WITH READ ONLY オプション — このビューの基になっているテーブルに対して、このビューからは挿入、更新、削除の各操作を実行できないように指定します。既定では、後述の制限を条件として、ビュー経由でこれらの操作が許可されます。
WITH level CHECK OPTION オプション — このビューの基になっているテーブルに対して、挿入、更新、削除の各操作をこのビューからどのように実行するかを指定します。level には、キーワード LOCAL または CASCADED を指定できます。level を指定しない場合、WITH CHECK OPTION は既定で CASCADED になります。
概要
CREATE VIEW コマンドは、ビューの内容を定義します。ビューを定義する SELECT 文は、複数のテーブルや他のビューを参照できます。作成するビューの SELECT 節内から参照するオブジェクトを選択するには、適切な特権が必要です。
ビューがコンパイルされると、ビューの作成者 (所有者) に %ALTER 特権の WITH GRANT OPTION が与えられます。
CREATE VIEW コマンドの実行には特権が必要です。CREATE VIEW を使用する前に、%CREATE_VIEW 特権を得る必要があります。この設定を行わないと、SQLCODE -99 (特権違反) になります。適切な付与特権を持っていれば、GRANT コマンドを使用して、%CREATE_VIEW 特権を割り当てることができます。埋め込み SQL では、以下のように $SYSTEM.Security.Login メソッドを使用して適切な特権を持ったユーザとしてログインできます。
   DO $SYSTEM.Security.Login("_SYSTEM","SYS")
   &sql(      )
%CREATE_VIEW 特権は GRANT コマンドで割り当てます。このときユーザまたはロールにこの特権を割り当てる必要があります。この要件は設定可能です。
既定は “真 (true)” (1) です。“真” の場合、ユーザは特権が付与されているテーブルやビューのみでアクションを実行できます。この設定を推奨します。
このオプションが “偽 (false)” (0) に設定されている場合、SQL セキュリティは無効になります。つまり、特権ベースのテーブルやビューのセキュリティは抑制されていることを意味します。ユーザを指定しなくてもテーブルの作成が可能になります。この場合、ダイナミック SQL はユーザとして "_SYSTEM" を、埋め込み SQL はユーザとして "" (空文字列) を割り当てます。ユーザは特権がなくてもテーブルやビューに対してアクションを実行することができます。
ビューの名前付け規約
ビュー名の名前付け規約は、テーブル名の名前付け規約と同じです。同じスキーマ内では、テーブルとビューに同じ名前を使用できません。同じ名前にすると、SQLCODE –201 が返されます。
ビュー名は、識別子の規則に従い、以下のような制約を受けます。既定のビュー名は、簡単な識別子です。ビュー名は 128 文字を超えることはできません。
Caché はビュー名を使用して、対応するクラス名を生成します。クラス名には英数字 (文字および数字) のみが使用され、その長さは最大 25 文字です。このクラス名を生成するために、Caché は最初にビュー名から句読点を削除し、次に 25 文字 (未満) の一意の識別子を生成します。その際、クラス名の一意性を維持するために、必要に応じて最後の文字を数字に置き換えます。Caché は有効なビュー名から一意のクラス名を生成しますが、ビューの名前を付ける際には、この名前の生成に伴う以下の制約について考慮する必要があります。
ビュー名は修飾、未修飾のどちらでもかまいません。修飾付きのビュー名には、以下の構文を使用します。
schema.viewname
未修飾のビュー名には、既定として SQLUser スキーマ (または事前構成されたシステム既定のスキーマ名) が使用されます。Caché はスキーマ名を使用して、対応するクラス・パッケージ名を生成します。SQLUser からは、パッケージ名 User が生成されます。スキーマ名と既定値の詳細は、"テーブル参照" を参照してください。
複雑な SELECT 節
ビューは、特定のテーブルの行や列の単純なサブセットである必要はありません。ビューは、任意の複雑度を持つ SELECT 節で、複数のテーブルや他のビューを使用して作成できます。ただし、ビュー定義に使用する SELECT 節には、いくつかの制約があります。CREATE VIEW 文には、以下の内容が適用されます。
ビュー内の列名を指定する column-commalist には、SELECT クエリで指定したのと同じ列数が含まれている必要があります。ビューとクエリとで列数が一致していない場合は、コンパイル時に SQLCODE -142 が発生します。以下の例は、ビューとクエリで列が一致するときの CREATE VIEW を示しています。
CREATE VIEW MyView (ViewCol1, ViewCol2, ViewCol3) AS
     SELECT TableCol1, TableCol2, TableCol3 
     FROM MyTable
また、クエリで AS キーワードを使ってビュー列をクエリ列 (またはビュー列のペア) として関連付けることもできます。以下はその例です。
CREATE VIEW MyView AS 
  SELECT TableCol1 AS ViewCol1,
     TableCol2 AS ViewCol2,
     TableCol3 AS ViewCol3
     FROM MyTable
CREATE VIEW には、2 つのテーブルの UNION 結合から列を選択する UNION 文を含めることができます。以下の埋め込み SQL の例のように、UNION を指定することができます。
   DO $SYSTEM.Security.Login("_SYSTEM","SYS")
   &sql(CREATE VIEW MyView (vname,vstate) AS
  SELECT t1.name,t1.home_state
    FROM Sample.Person AS t1
  UNION
  SELECT t2.name,t2.office_state
    FROM Sample.Employee AS t2)
  WRITE !,"SQL error code is: ",SQLCODE
上記の例のように、ビュー名が未修飾の場合は、ビューによって参照されるテーブルが Sample スキーマに属していたとしても、システム全体の既定 SQL スキーマ名 (この場合は User.MyView) が既定のスキーマになることに注意してください。ビューを関連するテーブルとともに確実に格納するために、ビュー名は常に修飾付きにすることをお勧めします。
ビュー経由の更新
ビューを使用して、ビューの基であるテーブルの更新が可能です。ビュー経由で、新しい行の INSERT による挿入、行データの UPDATE による更新、および、行の DELETE による削除が可能です。CREATE VIEW 文にこの機能を指定していれば、INSERT 文、UPDATE 文、DELETE 文をビューに発行できます。ビュー経由の更新を許可するには、WITH CHECK OPTION (既定) を指定します。
ビュー経由の更新を禁止するには、WITH READ ONLY を指定します。WITH READ ONLY で生成されているビューで INSERTUPDATE、または DELETE を実行すると、SQLCODE = -35 エラーが返されます。
ビュー経由の更新を実行するには、GRANT コマンドによって、テーブルやビューの更新に対応する特権を指定することが必要です。
ビュー経由で更新するには、以下の制限に従います。
WITH CHECK OPTION 節を指定すると、挿入または更新操作の際に、その結果行がビュー定義の WHERE 節に対して検証されます。これで、挿入または変更した行が、確実に導出されたビュー・テーブルの一部になります。利用可能なチェック・オプションは以下に示す 2 つです。
WITH LOCAL CHECK OPTION では、INSERT または UPDATE 文で指定されたビューの WHERE 節のみがチェックされます。
WITH CASCADED CHECK OPTION では、INSERT または UPDATE 文で指定されたビューおよびすべての基本ビューで指定された WHERE 節がチェックされます。これは、この基本ビューのあらゆる WITH LOCAL CHECK OPTION 節よりも優先されます。CASCADED は、既定であり、更新可能なすべてのビューについて使用することをお勧めします。
INSERT オペレーションで WITH CHECK OPTION 検証 (上記の説明にある) に失敗すると、SQLCODE=–136 エラーが返されます。
UPDATE オペレーションで WITH CHECK OPTION 検証 (上記の説明にある) に失敗すると、SQLCODE=–137 エラーが返されます。
以下の例は、PhoneBook テーブルから "CityPhoneBook" という名前のビューを作成します。
CREATE VIEW CityPhoneBook AS
     SELECT Name FROM PhoneBook WHERE City='Boston'
以下の例は、Guides テーブルから "GuideHistory" という名前のビューを作成します。すべてのタイトル (Title 列から) と、その人が退職したか否かをリストにします。
CREATE VIEW GuideHistory AS
     SELECT Guides, Title, Retired, Date_Retired 
     FROM Guides
以下の埋め込み SQL 例は、テーブル MyTest を作成し、次に MyTest から 1 つのフィールドを選択するビュー MyTestView を作成します。
   DO $SYSTEM.Security.Login("_SYSTEM","SYS")
   &sql(CREATE TABLE Sample.MyTest (
  TESTNUM     INT NOT NULL,
  FIRSTWORD   CHAR (30) NOT NULL,
  LASTWORD    CHAR (30) NOT NULL,
  CONSTRAINT MyTestPK PRIMARY KEY (TESTNUM))
  )
  WRITE !,"SQL create table code is: ",SQLCODE
   &sql(CREATE VIEW Sample.MyTestView AS
     SELECT FIRSTWORD FROM Sample.MyTest
     WITH CASCADED CHECK OPTION)
  WRITE !,"SQL create view code is: ",SQLCODE
以下の例は、3 つのテーブル (Proj、Staff、Works) から "StaffWorksDesign" という名前のビューを作成します。Name 列、Cost 列、Project 列はデータを提供します。
CREATE VIEW StaffWorksDesign (Name,Cost,Project)
     AS SELECT EmpName,Hours*2*Grade,PName
     FROM Proj,Staff,Works 
     WHERE Staff.EmpNum=Works.EmpNum 
          AND Works.PNum=Proj.PNum AND PType='Design'
以下の例は、UNION を使用して b.table2 と a.table1 から選択することにより "v_3" という名前のビューを作成します。
CREATE VIEW v_3(fvarchar)
     AS SELECT DISTINCT * 
     FROM
       (SELECT fVARCHAR2 FROM b.table2 
        UNION ALL
        SELECT fVARCHAR1 FROM a.table1) 
関連項目
テーブル参照 ALTER VIEW DROP VIEW CREATE TABLE GRANT