ビュー定義を作成します。ビューとは、他の表に格納されている行を参照する論理構造体です。ビュー内のデータは、データベースに物理的には格納されません。ビュー定義には、他の表の行および列の組合せとスキーマ内のビュー定義を含めることができます。ビューを定義するには、次の機能を持つ選択式を指定します。
- ビューの表、行および列を選択する基準に名前を付ける機能
- これらの表から一連の列を指定する機能
CREATE VIEW文を実行すると、SQLにより物理データベースにビュー定義が追加されます。PATHNAME引数を使用してスキーマを宣言している場合、定義はリポジトリにも格納されます。
CREATE VIEW文は次の環境で使用できます。
- 対話型SQL内
- プリコンパイル対象のホスト言語プログラムに埋め込まれる場合
- SQLモジュールのプロシージャの一部として
- 動的SQLで動的に実行される文として
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
作成するビュー定義の名前です。名前の選択時に、次のルールに従ってください。
- スキーマ内のすべてのビューおよび表名間で一意の名前を使用すること。
- 有効なSQL名を使用すること(詳細は、第2.2節を参照)。
- ビューの行を挿入、更新または削除する文により、このビューの元になる実表の行が変更されます。
- ビューを参照するINSERT文、UPDATE文およびDELETE文を使用する場合、次の点に注意してください。
- INSERT文、UPDATE文またはDELETE文では読取り専用ビューを参照しないでください。次の機能を持つ選択式があるビューは、読取り専用ビューとみなされます。
- DISTINCT引数を使用して結果表から重複行を削除する機能
- FROM句で複数の表またはビューに名前を付ける機能
- 選択リストにファンクションを含める機能
- UNION句、EXCEPT (MINUS)句、INTERSECT句、GROUP BY句またはHAVING句が含まれる機能
- INSERT文およびUPDATE文では、値式の結果であるビューの列は参照できません。たとえば、次のビュー定義では、ARITH_COLUMNを参照するINSERT文は使用できません。
SQL> CREATE VIEW TEMP (ARITH_COLUMN, EMPLOYEE_ID) cont> AS SELECT (SALARY_AMOUNT * 3), EMPLOYEE_ID cont> FROM SALARY_HISTORY; SQL> SQL> INSERT INTO TEMP (ARITH_COLUMN) VALUES (111); %RDB-E-READ_ONLY_FIELD, attempt to update read-only field ARITH_COLUMN SQL> ROLLBACK;
- ANSI/ISO SQL規格に応じてSQLSTATEを正しく処理できるように、データベースのアタッチ時に言語がSQL99に設定されている場合、WITH CHECK OPTION違反によって発生する例外は変更されます。次に例を示します。
SQL> SET DIALECT 'SQL99'; SQL> ATTACH 'FILENAME personnel_test'; SQL> INSERT INTO MANAGERS VALUES (1, 'Fred', 10); %RDB-E-CHECK_FAIL, violation of view check option "MANAGERS_CHECKOPT1" caused operation to fail
この変更により、SQLではSQLSTATEの特殊値として44000を返し、アプリケーションでは制約とビュー・チェック・オプションの違反を区別できるようになります。$MESSAGE_VECTORを調べるエラー・ハンドラを調整し、RDB$_CHECK_FAIL(エラーRDB$_INTEG_FAILと同様)が正しく処理されるようにします。SQLSTATE値の詳細は、付録Cを参照してください。- WITH CHECK OPTION句を使用して、ビューで挿入または更新する行がその定義に準拠するようにします。
たとえば、次のビュー定義では、$60,000を超える給与のみが許可されます。WITH CHECK OPTION句を使用するため、$60,000未満の給与が含まれる行は挿入できません。
SQL> CREATE VIEW TEST cont> AS SELECT * FROM SALARY_HISTORY cont> WHERE SALARY_AMOUNT > 60000 cont> WITH CHECK OPTION CONSTRAINT TEST_VIEW_CONST; SQL> SQL> INSERT INTO TEST (SALARY_AMOUNT) VALUES (50); %RDB-E-INTEG_FAIL, violation of constraint TEST_VIEW_CONST- caused operation to fail- ビューを挿入または更新すると、行は実表に格納されます。WITH CHECK OPTION句を使用しない場合、ビューの定義に準拠しないビューを介して行を挿入または更新できます。ただし、これらの行はビュー定義によって指定された条件を満たさないため、格納された後、これらの行はビューを介して取得できません。
たとえば、次のビュー定義では、$60,000を超える給与のみが許可されます。ただし、INSERT文でビューを指定して給与額として$50を格納できます。これは、ビューの元になる表を参照することによってのみ取得できます。
SQL> CREATE VIEW TEMP cont> AS SELECT * FROM SALARY_HISTORY cont> WHERE SALARY_AMOUNT > 60000; SQL> SQL> INSERT INTO TEMP (SALARY_AMOUNT) VALUES (50); 1 row inserted SQL> -- Cannot get the row just stored through the view TEMP: SQL> -- SQL> SELECT * FROM TEMP WHERE SALARY_AMOUNT < 100; 0 rows inserted SQL> -- To retrieve the row, select it from the base table SQL> -- SQL> SELECT * FROM SALARY_HISTORY WHERE SALARY_AMOUNT < 100; EMPLOYEE_ID SALARY_AMOUNT SALARY_START SALARY_END NULL 50.00 NULL NULL 1 row inserted
- 作成できるビューの数は最大53,247です。これらの値は、オンディスク構造によって課されるアーキテクチャ上の制限です。ビューの最大制限を超えると、Oracle RdbによりMAXVIEWIDエラー・メッセージが表示されます。
ビューには、12288〜65535の範囲でレコードIDを設定できます。
古いビューを削除すると、最大値に達してもCREATE VIEW文を正常に処理できるように、これらの識別子は再利用されます。- CREATE VIEW文では、DATA DEFINITIONモードで予約された表を参照できます。
例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 ;
このビュー定義では、次を実行しています。
- ビューの列にローカル名を指定します。
- EMPLOYEES表とJOB_HISTORY表を結合します。この結合により、EMPLOYEES表の行とJOB_HISTORY表の行がリンクされます。
- JOB_HISTORY表とJOBS表を結合します。この結合により、職種コードのかわりに役職をビューに含めることができます。
- JH.JOB_END IS NULL式を使用します。この句により、JOB_END列がNULLである現在のJOB_HISTORY行のみがビューに含まれるよう指定します。
次の問合せでは、前の例で定義されたビューを使用しています。
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文は次の環境で使用できます。
- プリコンパイル対象のホスト言語プログラムに埋め込まれる場合
- コンテキスト・ファイル内
- SQLモジュールのDECLAREセクションの一部として
宣言する別名は、モジュールに指定されている他の別名とは異なる必要があります。
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でいつ再使用できるかを制御します。
- デフォルトのDBKEY SCOPE IS TRANSACTIONの場合、元の行を削除したトランザクションがCOMMIT文で完了すると、ただちに削除された表の行のデータベース・キーをSQLで再使用(および新しく挿入された行を参照)できます。(元の行を削除したユーザーがROLLBACK文を入力すると、この行のデータベース・キーはSQLで再使用できなくなります。)
DECLARE ALIAS文を入力したユーザーの接続中は、DBKEY SCOPE IS TRANSACTION句により、データベース・キーが特定のトランザクション内の同じ行のみを参照することが保証されます。- DBKEY SCOPE IS ATTACH句の場合、DBKEY SCOPE IS ATTACHによってアタッチされたすべてのユーザーがデータベースからデタッチされるまでは、SQLでデータベース・キーを再使用(および新しく挿入された行を参照)できません。
DBKEY SCOPE IS ATTACHを使用したアタッチによって、すべてのデータベース・ユーザーにこの特性を前提とすることを強制するために必要なステップは1つのみです。- DBKEY SCOPE IS ATTACHをサポートするために必要なオーバーヘッド領域による記憶域領域の過度な消費を防止し、新規行を格納する際のパフォーマンス問題を防止するために、DBKEY SCOPE IS TRANSACTIONの使用をお薦めします。
DECLARE ALIAS文を入力したユーザーの接続中は、DBKEY SCOPE IS ATTACH句により、ユーザーがデータベースからデタッチされるまではデータベース・キーが同じ行を参照することが保証されます。
詳細は、第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モジュール言語の別名宣言の有効範囲を指定します。有効範囲オプションの宣言は、次のとおりです。
- LOCAL: 宣言されるモジュール内のプロシージャに対してローカルであるか、宣言されるモジュール内で準備された動的文に対してローカルである別名を宣言します。
有効範囲がLOCALであるデータベースにアタッチするのは、セッションなしで同じモジュール内のプロシージャを実行する場合のみです。有効範囲がLOCALであるデータベースの別名は、そのモジュールにのみ属します。
別のモジュール内のプロシージャの実行によって暗黙的環境にアタッチされているときに、このプロシージャによってローカル・データベースを参照する別のプロシージャが後でコールされると、このローカル・データベースへのアタッチが試行されます。アクティブなトランザクションがない場合、このローカル・データベースはこのモジュールの暗黙的環境に追加されます。アクティブなトランザクションがある場合、エラー・メッセージが返されます。- GLOBAL: アプリケーション内のプロシージャに対してグローバルである別名定義を宣言します。デフォルトはGLOBALです。
- EXTERNAL: 別のモジュールで定義されたグローバル別名への外部参照を宣言します。
単一イメージのアプリケーションの場合、一般的には別名定義と別名参照間の区別は重要ではありません。各別名に少なくとも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を指定する場合、次のようになります。
- コンパイル時に、アプリケーションはリポジトリ・データベース定義にアタッチされ、ディクショナリ定義からメタデータを読み取ります。Oracle Rdbデータベースのファイル名はディクショナリから抽出され、実行時に使用するために保存されます。
- 実行時に、アプリケーションはコンパイル時にディクショナリから抽出されたOracle Rdbデータベースのファイル名にアタッチされます。
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権限が必要です。