ヘッダーをスキップ
Oracle Rdb SQLリファレンス・マニュアル
リリース7.2
E06178-01
  目次
目次
索引
索引

戻る
戻る
 
次へ
次へ
 


CREATE VIEW文

ビュー定義を作成します。ビューとは、他の表に格納されている行を参照する論理構造体です。ビュー内のデータは、データベースに物理的には格納されません。ビュー定義には、他の表の行および列の組合せとスキーマ内のビュー定義を含めることができます。ビューを定義するには、次の機能を持つ選択式を指定します。

CREATE VIEW文を実行すると、SQLにより物理データベースにビュー定義が追加されます。PATHNAME引数を使用してスキーマを宣言している場合、定義はリポジトリにも格納されます。


環境

CREATE VIEW文は次の環境で使用できます。


形式






引数

check-option-clause

ビューに対する更新操作に制限を課す制約です。チェック・オプション句により、表で挿入または更新された行がビューの定義に準拠していることを確認します。 読取り専用のビューにはWITH CHECK OPTION句を指定しないでください。(SQLで読取り専用とみなされるビューは、「使用方法」を参照してください。)

column-name

ビューの列名のリストです。列名を省略すると、SQLによって選択式でソース表の列名が割り当てられます。

ただし、次の場合は、ビューのすべての列に対して名前を指定する必要があります。

CONSTRAINT check-option-name

WITH CHECK OPTION制約の名前を指定します。名前を省略すると、SQLにより名前が作成されます。ただし、Oracle Rdbでは、制約に常に名前を付けることをお薦めします。WITH CHECK OPTION制約に名前を付ける場合、その名前はスキーマで一意である必要があります。

WITH CHECK OPTION制約の名前は、INSERT文またはUPDATE文が制約に違反した場合にINTEG_FAILエラー・メッセージによって使用されます。

select-expr

指定した表の列および行のうちビューに含めるものを定義する選択式。非マルチスキーマ・データベースの選択式の場合、ビューとして名前を付けることができるのは同じスキーマ内の表のみです。マルチスキーマ・データベースの選択式の場合は、データベース内の任意のスキーマ内の表に名前を付けることができます。この場合、作成対象のビューと同じカタログ内にスキーマがなくてもかまいません。選択式の詳細は、第2.8.1項を参照してください。

sql-and-dtr-clause

オプションのSQLフォーマット句およびDATATRIEVEフォーマット句です。フォーマット句の詳細は、第2.5節を参照してください。

STORED NAME IS stored-name

マルチスキーマ・データベースに作成したビューへのアクセスに使用される名前を指定します。ストアド名を使用すると、Oracle Rdb管理ユーティリティであるOracle RMUなどのインタフェースを使用して、マルチスキーマ定義にアクセスできます。このユーティリティでは、1つのデータベース内で複数のスキーマを認識しません。複数のスキーマに対応しないデータベース内では、ビューのストアド名は指定できません。ストアド名の詳細は、第2.2.18項を参照してください。

view-name

作成するビュー定義の名前です。名前の選択時に、次のルールに従ってください。


使用方法


例1: 単一表に基づくビューの定義

この例は、単一表であるEMPLOYEESから3つの列を使用するビュー定義を示しています。


SQL> CREATE VIEW EMP_NAME
cont>   AS SELECT
cont>           FIRST_NAME,
cont>           MIDDLE_INITIAL,
cont>           LAST_NAME
cont>      FROM EMPLOYEES;
SQL> --
SQL> -- Now display the rows from the view just created.
SQL> SELECT * FROM EMP_NAME;
 FIRST_NAME   MIDDLE_INITIAL   LAST_NAME
 Alvin        A                Toliver
 Terry        D                Smith
               .
               .
               .

例2: ビュー定義に準拠しない行を挿入または更新できないビューの定義

この例は、WITH CHECK OPTION句を使用したビュー定義を示しています。


SQL>  CREATE VIEW ADMN_VIEW
cont>        AS SELECT * FROM JOB_HISTORY
cont>        WHERE DEPARTMENT_CODE = 'ADMN'
cont>        WITH CHECK OPTION CONSTRAINT ADMN_VIEW_CONST;
SQL> -- You cannot insert a row that does not
SQL> -- conform to the view definition.
SQL> --
SQL>  INSERT INTO ADMN_VIEW (DEPARTMENT_CODE) VALUES ('MBMN');
%RDB-E-INTEG-FAIL, violation of constraint ADMN_VIEW_CONST-
caused operation to fail

例3: 複数の表に基づくビューの定義

複数の表を使用してビューを定義することもできます。


SQL> CREATE VIEW CURRENT_SALARY
cont>  AS SELECT
cont>        E.LAST_NAME,
cont>        E.FIRST_NAME,
cont>        E.EMPLOYEE_ID,
cont>        SH.SALARY_START,
cont>        SH.SALARY_AMOUNT
cont>      FROM
cont>        SALARY_HISTORY SH, EMPLOYEES E
cont>      WHERE
cont>        SH.EMPLOYEE_ID = E.EMPLOYEE_ID
cont>      AND
cont>        SH.SALARY_END IS NULL           ;

この例では、EMPLOYEES表とSALARY_HISTORY表からビューを定義しています。ここでは、選択式を使用して次を実行しています。

例4: ローカル列名を使用したビューの定義


SQL> CREATE VIEW EMP_JOB
cont>      ( CURRENT_ID,
cont>        CURRENT_NAME,
cont>        CURRENT_JOB,
cont>        SUPERVISOR   )
cont>  AS SELECT
cont>        E.EMPLOYEE_ID,
cont>        E.LAST_NAME,
cont>        J.JOB_TITLE,
cont>        JH.SUPERVISOR_ID
cont>     FROM
cont>        EMPLOYEES E,
cont>        JOB_HISTORY JH,
cont>        JOBS J
cont>     WHERE
cont>        E.EMPLOYEE_ID = JH.EMPLOYEE_ID
cont>     AND
cont>        JH.JOB_CODE = J.JOB_CODE
cont>     AND
cont>        JH.JOB_END IS NULL      ;

このビュー定義では、次を実行しています。

次の問合せでは、前の例で定義されたビューを使用しています。


EXEC SQL
        DECLARE X CURSOR FOR
        SELECT  CURRENT_ID, CURRENT_NAME, CURRENT_JOB, SUPERVISOR
        FROM    EMP_JOB
END-EXEC

EXEC SQL
        OPEN X
END-EXEC


PERFORM WHILE SQLCODE NOT = 0

        EXEC SQL
                FETCH X
                INTO :ID, :NAME, :JOB, :SUPER
        END-EXEC

END PERFORM


EXEC SQL
        CLOSE X
END-EXEC

例5: 計算列を使用したビューの定義

この例は、実表の列に基づく計算を介して列を導出するビュー定義を示しています。


SQL> CREATE VIEW SS_DEDUCTION
cont>        ( IDENT,
cont>          SALARY,
cont>          SS_AMOUNT )
cont>  AS SELECT
cont>        E.EMPLOYEE_ID,
cont>        SH.SALARY_AMOUNT,
cont>        SH.SALARY_AMOUNT * 0.065
cont>      FROM
cont>        SALARY_HISTORY SH, EMPLOYEES E
cont>      WHERE
cont>        SH.EMPLOYEE_ID = E.EMPLOYEE_ID
cont>      AND
cont>        SH.SALARY_END IS NULL   ;

ビュー列SS_AMOUNTが選択されるたびに、SALARY_HISTORY表のSALARY_AMOUNT列から新規の値が計算されます。

例6: 別のビューに依存するビューの定義

この例では、定義上、エンジニアリング部門の従業員に関する現在の職種情報を含めるためにCURRENT_JOBビューを参照するDEPENDENT_VIEWビューを作成しています。


SQL> CREATE VIEW DEPENDENT_VIEW
cont>   AS SELECT * FROM CURRENT_JOB
cont>           WHERE DEPARTMENT_CODE = 'ENG';


DECLARE ALIAS文

モジュールのコンパイルに使用するデータベース定義の名前とソースを指定し、名前付き別名をアプリケーションの暗黙的環境の一部にします。データベース定義に使用するためにファイル名またはリポジトリ・パス名を指定できます。

環境

DECLARE ALIAS文は次の環境で使用できます。

宣言する別名は、モジュールに指定されている他の別名とは異なる必要があります。


形式













引数

alias ALIAS

データベースにアタッチする名前を指定します。別名を指定すると、プログラムで複数のデータベースを参照できるようになります。

DECLARE ALIAS文で別名を指定する必要はありません。対話型SQLおよびプリコンパイルされたプログラム内のデフォルトの別名は、RDB$DBHANDLEです。SQLモジュール言語では、デフォルトはモジュール・ヘッダーに指定された別名です。DECLARE ALIAS文で明示的に指定するか、任意の別名を省略することにより、デフォルトの別名を使用すると、データベースがデフォルト環境の一部になります。デフォルト・データベースを指定すると、デフォルト・データベースを参照する文で別名の使用が不要になります。

デフォルトの別名がすでに宣言されているときにデフォルトの別名をALIAS句に指定(または、すでに宣言されている任意の別名を指定)すると、プログラムをプリコンパイルするかSQLモジュール・プロセッサを使用してプログラムを処理するときにエラーが表示されます。

database-options

デフォルトでは、プログラムのコンパイルに使用されたデータベース・オプションのみがこのプログラムの有効なオプションとして使用されます。サポートされている他のデータベースでこのプログラムを使用するには、ATTACH文またはDECLARE ALIAS文にデータベース・オプションを指定することにより、デフォルトのオプションをオーバーライドできます。

データベース・オプションの詳細は、第2.10節を参照してください。

DBKEY SCOPE IS ATTACH

DBKEY SCOPE IS TRANSACTION

削除された行のデータベース・キーをSQLでいつ再使用できるかを制御します。

詳細は、第2.6.5項を参照してください。

DEFAULT CHARACTER SET support-char-set

コンパイル時における別名のデフォルト・キャラクタ・セットを指定します。使用可能なキャラクタ・セット名のリストは、第2.1節を参照してください。

DISPLAY CHARACTER SET support-char-set

Oracle Rdbから返されるテキスト文字列で想定されるキャラクタ・セットのエンコーディングおよび特性を指定します。詳細は、「CREATE DATABASE文」の「使用方法」を参照してください。

FILENAME 'attach-spec'

データベースにアクセスするために必要な完全または部分的な情報が含まれる引用符付き文字列です。

Oracle Rdbデータベースの場合、アタッチ仕様には、.rdbファイルのファイル仕様が含まれます。

FILENAME引数を使用する場合、データベース定義に対する変更は、リポジトリではなくデータベース・システム・ファイルにのみ入力されます。FILENAMEを指定する場合、アプリケーションは実行時にこのファイル名を使用してデータベースにアタッチされます。

FILENAMEを指定する場合、次のようになります。

node-specおよびfile-specの詳細は、第2.2.8.1項を参照してください。

FOR COMPILETIME

上位互換性を確保するために提供されたオプションのキーワードです。デフォルトでは、DECLARE ALIASによってコンパイル時の環境が指定されます。宣言された別名がプログラムのコンパイルおよび実行用のデータベース定義のソースとなるよう指定します。

lit-or-def-user-authentication

データベース(特にリモート・データベース)へのアクセスの許可に使用するユーザー名およびパスワードを指定します。

この句を使用して、DECLARE ALIAS文でユーザー名およびパスワード情報を明示的に指定できます。

literal-user-auth

実行時にアクセスする指定データベースのユーザー名およびパスワードを指定します。この句を使用する場合の詳細は、「ATTACH文」を参照してください。

LOCAL

GLOBAL

EXTERNAL

プリコンパイルされたSQLまたはSQLモジュール言語の別名宣言の有効範囲を指定します。

有効範囲オプションの宣言は、次のとおりです。

単一イメージのアプリケーションの場合、一般的には別名定義と別名参照間の区別は重要ではありません。各別名に少なくとも1つの定義があることのみが必要です。このため、Oracle Rdbでは、(EXTERNALキーワードを使用して宣言される)別名参照はすべて、(GLOBALキーワードを使用して宣言される、またはデフォルトの)別名定義と同じものとして処理されます。以前のバージョンとの互換性を確保するため、これがデフォルトのままです。

ただし、複数のイメージ間で別名を共有するアプリケーションの場合は、別名定義と別名参照を区別する必要があります。複数のOpenVMSイメージ間で共有される別名の定義はすべて、1つのイメージ(通常は他のイメージのリンク先の共有可能イメージ)に定義する必要があります。

Oracle Rdbでは、新規ソース・コードでは別名定義と別名参照を区別することをお薦めします。別名定義にはGLOBAL(またはデフォルトの)有効範囲キーワード、別名参照にはEXTERNALキーワードを使用します。複数のOpenVMSイメージ間で別名を共有する場合、NOEXTERNAL_GLOBALSコマンドライン修飾子を使用してデフォルトをオーバーライドし、別名参照が参照として処理されるようにします。

EXTERNAL_GLOBALコマンドライン修飾子を使用する場合、EXTERNALキーワードを使用して宣言された別名はGLOBALとして処理されます。つまり、別名参照とともに別名定義が初期化されます。

NOEXTERNAL_GLOBALコマンドライン修飾子を使用する場合、EXTERNALキーワードを使用して宣言された別名は別参照として処理され、初期化されません。他のすべての別名は初期化されます。

デフォルトはEXTERNAL_GLOBAL修飾子です。

また、[NO]INITIALIZE_HANDLESコマンドライン修飾子も別名の初期化に影響しますが、これらは、V7.0より前のバージョンでのみ使用することをお薦めします。

コマンドライン修飾子の詳細は、第3.6節および第4.3節を参照してください。

MULTISCHEMA IS ON

MULTISCHEMA IS OFF

MULTISCHEMA IS ON句を使用すると、データベースのアタッチ中にマルチスキーマ・ネーミングが有効になります。MULTISCHEMA IS OFF句を使用すると、データベースのアタッチ中にマルチスキーマ・ネーミングが無効になります。デフォルトでは、マルチスキーマ・ネーミングは無効です。

NATIONAL CHARACTER SET support-char-set

コンパイル時における別名の各国語キャラクタ・セットを指定します。使用可能なキャラクタ・セット名のリストは、第2.1節を参照してください。

PATHNAME path-name

データベース定義のソースを指定するリポジトリのフルパス名または相対パス名です。PATHNAME引数を使用する場合、データベース定義に対する変更は、リポジトリとデータベース・システム・ファイルの両方に入力されます。システム上にリポジトリがあり、データ定義文を使用する予定がある場合、Oracle Rdbでは、PATHNAME引数の使用をお薦めします。

PATHNAMEを指定する場合、次のようになります。

PRESTARTED TRANSACTIONS ARE ON

PRESTARTED TRANSACTIONS ARE OFF

Oracle Rdbで事前起動済トランザクションを有効にするか無効にするかを指定します。

データベースに長期間アタッチされているサーバー・プロセスがアプリケーションに使用されるためにスナップショット・ファイルが大きくなりすぎる場合、PRESTARTED TRANSACTIONS ARE OFF句を使用してください。PRESTARTED TRANSACTIONS ARE OFF句を使用する場合、SET TRANSACTION文ごとにトランザクション順序番号(TSN)を予約する必要があるために、追加のI/Oが必要になる場合があります。

Oracle Rdbでは、ほとんどのアプリケーションについて、事前起動済トランザクションを有効にすることをお薦めします。デフォルトはPRESTARTED TRANSACTIONS ARE ONです。PRESTARTED TRANSACTIONS ARE ON句を使用する場合や、PRESTARTED TRANSACTIONS句を指定しない場合、これより前の読取り/書込みトランザクションに対するCOMMIT文またはROLLBACK文により、次のトランザクションのTSNが自動的に予約され、I/Oが削減されます。

ALTER DATABASE...PRESTARTED TRANSACTIONS句を使用すると、データベースを使用するすべてのアプリケーションのデフォルト設定を確立できます。また、RDMS$BIND_PRESTART_TXN論理名を定義することにより、事前起動済トランザクションのデフォルト設定をアプリケーションの外部で定義することもできます。この論理名とデータベース設定は、PRESTARTED TRANSACTION句によってオーバーライドされます。詳細は、『Oracle Rdb7 Guide to Database Performance and Tuning』を参照してください。

RESTRICTED ACCESS

NO RESTRICTED ACCESS

データベースへのアクセスを制限します。これにより、データベースにアクセスしたときに、データベースから切断されるまで他のすべてのユーザーをロックアウトできます。データベースへのアクセス制限を設定するには、DBADM権限が必要です。