プライマリ・コンテンツに移動
Oracle® Database管理者ガイド
12cリリース1 (12.1)
B71301-11
目次へ移動
目次
索引へ移動
索引

前
次

24 ビュー、順序およびシノニムの管理

Oracle Databaseでビュー、順序およびシノニムを作成および管理できます。

24.1 ビューの管理

ビューの作成、ビューの置換、ビューの変更およびビューの削除などのタスクを実行できます。

Live SQL:

Oracle Live SQLでビューの管理に関連する例を参照および実行するには、「Oracle Live SQL: ビューの作成、置換および削除」に移動してください。

24.1.1 ビューの概要

ビューとは、表または表の組合せの論理表現です。本質的には、ビューは格納された問合せです。

ビューのデータは、そのビューの基礎となる表から生成されます。この表を実表と呼びます。実表は、実際の表の場合もビュー自体の場合もあります。ビューに対して実行するすべての操作は、実際にはビューの実表に影響します。ビューの使用方法は、表の場合とほぼ同じです。通常の表と同様に、ビューに対する問合せ、更新、挿入および削除ができます。

ビューによって、他の表およびビューに常駐するデータの様々な表現(サブセットまたはスーパーセットなど)が可能です。ビューを使用すると、ユーザーの必要にあわせて調整したデータ表現ができます。

注意:

ビューの1つの特殊なタイプがエディショニング・ビューで、エディションに基づく再定義を使用したオンラインでのアプリケーションのアップグレードをサポートするためにのみ使用されるビューです。ビューの管理に関する項のここからは、エディショニング・ビューを除くすべてのビューについて説明します。エディショニング・ビューおよびエディションに基づく再定義の詳細は、『Oracle Database開発ガイド』を参照してください。

関連項目:

ビューの概要については、『Oracle Database概要』を参照してください。

24.1.2 ビューおよび結合ビューの作成

ビューを作成するには、CREATE VIEW文を使用します。ビューはそれぞれ、表、マテリアライズド・ビューまたは他のビューを参照する問合せによって定義されます。FROM句で、複数の実表またはビューを指定する結合ビューを作成することもできます。

24.1.2.1 ビューの作成

ビューを作成するには、CREATE VIEW文を使用します。

ビューを作成するには、次に示す要件を満たす必要があります。

  • 自分のスキーマに新しいビューを作成するには、CREATE VIEWシステム権限が必要です。別のユーザーのスキーマ内にビューを作成するには、CREATE ANY VIEWシステム権限が必要です。これらの権限は明示的に取得するか、またはロールを介して取得できます。

  • どのスキーマのビューであっても、その所有者は、ビュー定義で参照されるすべてのオブジェクトにアクセスする権限を明示的に付与されている必要があります。所有者がロールを介してこれらの権限を取得することはできません。また、ビューの機能は、ビューの所有者の権限によって決まります。たとえば、ビューの所有者にScottのemp表のINSERT権限しかない場合、emp表に新しい行を挿入するためにはビューを使用できますが、このビューの行を選択(SELECT)、更新(UPDATE)または削除(DELETE)するためには使用できません。

  • ビューの所有者がビューにアクセスする権限を他のユーザーに付与しようとする場合は、ベース・オブジェクトに対するGRANT OPTION付きのオブジェクト権限、またはADMIN OPTION付きのシステム権限が必要です。

ビューを作成するには、CREATE VIEW文を使用します。ビューはそれぞれ、表、マテリアライズド・ビューまたは他のビューを参照する問合せによって定義されます。すべての副問合せと同様に、ビューを定義する問合せには、FOR UPDATE句を指定できません。

次の文は、hr.departments表のデータのサブセットに対してビューを作成します。

CREATE VIEW departments_hq AS
      SELECT department_id, department_name, location_id
      FROM hr.departments
      WHERE location_id = 1700
    WITH CHECK OPTION CONSTRAINT departments_hq_cnst;
      

departments_hqビューを定義する問合せは、場所1700の行のみを参照します。また、CHECK OPTIONは、そのビューが選択できない行に対してINSERT文およびUPDATE文を発行できないように制約(departments_hq_cnst)付きでビューを作成します。たとえば、次のINSERT文では、departments_hqビュー(場所が1700の行のみを含む)を使用してdepartments表に行が正常に挿入されます。

INSERT INTO departments_hq VALUES (300, 'NETWORKING', 1700);

しかし、次のINSERT文は、departments_hqビューを使用しても選択できない場所2700の行を挿入しようとしているため、エラーが返されます。

INSERT INTO departments_hq VALUES (301, 'TRANSPORTATION', 2700);

WITH READ ONLY句を指定してビューを作成できますが、これにより、このビューからは、実表の更新、挿入または削除ができなくなります。WITH句を指定しない場合、一部の制限を伴いますが、ビューは従来どおり更新可能です。

不可視の列を含むビューを作成することもできます。たとえば、次の文ではdepartments_hq_manビューが作成され、manager_id列が不可視になります。

CREATE VIEW departments_hq_man 
         (department_id, department_name, manager_id INVISIBLE, location_id)
      AS SELECT department_id, department_name, manager_id, location_id
      FROM hr.departments
      WHERE location_id = 1700
    WITH CHECK OPTION CONSTRAINT departments_hq_man_cnst;
      

関連項目:

  • CREATE VIEW文の構文とセマンティクスの詳細は、『Oracle Database SQL言語リファレンス』を参照してください

  • 「不可視の列の理解」

24.1.2.2 結合ビューの作成

CREATE VIEW文のFROM句を使用して、複数の実表またはビューを指定するビューを作成することもできます。この種のビューを結合ビューと呼びます。

次の文は、emp表とdept表のデータを結合するdivision1_staffビューを作成します。

CREATE VIEW division1_staff AS
      SELECT ename, empno, job, dname
      FROM emp, dept
      WHERE emp.deptno IN (10, 30)
         AND emp.deptno = dept.deptno;

更新可能な結合ビューは、UPDATEINSERTおよびDELETE操作が可能な結合ビューです。詳細は、「結合ビューの更新」を参照してください。

24.1.2.3 ビュー作成時の問合せ定義の展開

ビューが作成されるときに、Oracle Databaseは最上位のビュー問合せのワイルドカード(*)を列リストに展開します。結果の問合せデータ・ディクショナリに格納され、副問合せはそのまま残されます。

展開された列リスト中の列名は引用符で囲まれており、これは、ベース・オブジェクトの列がもともと引用符付きで入力された可能性があり、問合せの構文を正しいものにするためには引用符が必要であることを示しています。

たとえば、deptビューが次のように作成される場合を想定します。

CREATE VIEW dept AS SELECT * FROM scott.dept;

データベースは、deptビューを定義している問合せを次のように格納します。

SELECT "DEPTNO", "DNAME", "LOC" FROM scott.dept;

エラー付きで作成されたビューでは、ワイルドカードは展開されません。エラーなしでビューがコンパイルされると、定義された問合せのワイルドカードが展開されます。

24.1.2.4 エラー付きビューの作成

CREATE VIEW文に構文エラーがない場合は、そのビューを定義している問合せを実行できなくても、データベースはビューを作成できます。この場合、ビューは、エラー付きで作成されたとみなされます。

たとえば、存在しない表や既存の表の無効な列を参照するビューを作成するとき、またはビューの所有者が必要な権限を持っていないときでも、ビューを作成し、データ・ディクショナリに登録できます。ただし、そのビューは使用できません。

エラー付きのビューを作成するには、CREATE VIEW文のFORCE句を指定する必要があります。

CREATE FORCE VIEW AS ...;

デフォルトでは、エラー付きのビューはINVALIDとして作成されます。このようなビューを作成しようとすると、ビューがエラー付きで作成されたことを示すメッセージが返されます。状況が変化して無効なビューの問合せが実行可能になると、ビューは再コンパイルされ、有効(使用可能)になります。条件の変更とビューに及ぼす影響の詳細は、「オブジェクト依存性の管理」を参照してください。

24.1.3 ビューの置換

ビューを置換するには、ビューを削除して再作成するか、OR REPLACE句を指定してCREATE VIEW文を発行します。

ビューを置換するには、ビューの削除および作成に必要なすべての権限が必要です。ビューの定義を変更する場合は、そのビューを置換する必要があり、ビューの定義の変更にALTER VIEW文は使用できません。次の方法でビューを置換できます。

  • ビューを削除してから再作成します。

    注意:

    ビューを削除するときに、ロールおよびユーザーに付与された対応するオブジェクト権限はすべて取り消されます。ビューを再作成してから、再度権限を付与してください。

  • OR REPLACE句を含むCREATE VIEW文によって、ビューを再定義します。OR REPLACE句は、ビューの現行の定義を置換し、現行のセキュリティ認可を保存します。たとえば、前述のように、sales_staffビューを作成し、いくつかのオブジェクト権限をロールと他のユーザーに付与した場合を想定します。ただし、ここではsales_staffビューを再定義して、WHERE句に指定されている部門番号を変更するものとします。この場合は、次の文によって、sales_staffビューの現行バージョンを置換できます。

    CREATE OR REPLACE VIEW sales_staff AS
         SELECT empno, ename, deptno
         FROM emp
         WHERE deptno = 30
         WITH CHECK OPTION CONSTRAINT sales_staff_cnst;
    

ビューを置換する前に、次の影響を検討してください。

  • ビューを置換することによって、データ・ディクショナリ内のビュー定義が置換されます。ビューによって参照される基礎となるオブジェクトは影響を受けません。

  • 前のビューにはCHECK OPTIONで制約を定義していたが、新しいビュー定義には指定しない場合、その制約は削除されます。

  • 置換されたビューに依存しているビューはすべて無効(使用不可)になります。また、ビューの新しいバージョンでの変更内容によっては、依存しているPL/SQLプログラム・ユニットも無効になる場合があります。たとえば、ビューのWHERE句のみが変更された場合、依存しているPL/SQLプログラム・ユニットは有効のままです。ただし、ビューの列数、列名またはデータ型が変更された場合は、依存しているPL/SQLプログラム・ユニットも無効になります。データベースによる依存性管理の詳細は、「オブジェクト依存性の管理」を参照してください。

24.1.4 問合せでのビューの使用

ビューの問合せを実行できます。ビューに対してデータ操作言語(DML)の操作も実行できますが、一部の制限があります。

ビューに対して問合せを発行したり、INSERTUPDATEまたはDELETE文を発行するためには、そのビューに対するSELECTREADINSERTUPDATEまたはDELETEの各オブジェクト権限を、明示的にまたはロールを介して持っている必要があります。

ビューは、表と同じ方法で問い合せることができます。たとえば、Division1_staffビューを問い合せるには、そのビューを参照する有効なSELECT文を入力します。

SELECT * FROM Division1_staff;

ENAME        EMPNO       JOB             DNAME
------------------------------------------------------
CLARK         7782       MANAGER         ACCOUNTING
KING          7839       PRESIDENT       ACCOUNTING
MILLER        7934       CLERK           ACCOUNTING
ALLEN         7499       SALESMAN        SALES
WARD          7521       SALESMAN        SALES
JAMES         7900       CLERK           SALES
TURNER        7844       SALESMAN        SALES
MARTIN        7654       SALESMAN        SALES
BLAKE         7698       MANAGER         SALES

一部の制限を伴いますが、ビューを使用して、実表に対する行の挿入、更新または削除ができます。次の文は、sales_staffビューを使用してemp表に新しい行を挿入します。

INSERT INTO sales_staff
    VALUES (7954, 'OSTER', 30);

ビューに対するDML操作の制限では、次の基準がリストされている順に適用されます。

  1. ビューの定義にSETまたはDISTINCT演算子、GROUP BY句またはグループ関数を含む問合せが使用されている場合、そのビューによる実表への行の挿入、更新または削除はできません。
  2. ビューの定義にWITH CHECK OPTIONが使用されていて、行を実表から選択できない場合、そのビューによる実表への行の挿入または更新はできません。
  3. DEFAULT句を持たないNOT NULL列がビューから省略されている場合、そのビューによる実表への行の挿入はできません。
  4. ビューの作成にDECODE(deptno, 10, "SALES", ...)のような式が使用されている場合、そのビューによる実表への行の挿入または更新はできません。

sales_staffビューのWITH CHECK OPTIONで作成された制約によって許可されるのは、部門番号30を持つ行のemp表への挿入または更新のみです。一方、次の文(つまり、deptno列を除外する)でsales_staffビューが定義されるとします。

CREATE VIEW sales_staff AS
    SELECT empno, ename
    FROM emp
    WHERE deptno = 10
    WITH CHECK OPTION CONSTRAINT sales_staff_cnst;

このビュー定義を検討すると、既存のレコードのempnoまたはenameフィールドは更新できますが、ビューではdeptnoフィールドを変更できないため、sales_staffビューを介してemp表に行を挿入することはできません。deptnoフィールドにDEFAULT値10を定義していた場合は、挿入を実行できます。

ユーザーが無効なビューを参照しようとすると、次のエラー・メッセージが返されます。

ORA-04063: view 'view_name' has errors

このエラー・メッセージが返されるのは、ビューは存在しているが、問合せのエラーが原因で使用禁止状態の場合です(このビューが最初に作成されたときにあったエラーか、またはビューは正常に作成されたが、基礎となるオブジェクトが変更または削除されたために、後で使用禁止状態になったかは関係ありません)。

24.1.5 DML文と結合ビュー

結合ビューに対してDML文を発行するときに制限が適用されます。

24.1.5.1 結合ビューの更新

更新可能な結合ビュー(変更可能な結合ビューと呼ぶこともあります)とは、SELECT文の最上位のFROM句に複数の表を含むビューで、WITH READ ONLY句の制限を受けないものです。

更新可能な結合ビューに関する規則を次の表に示します。これらの基準を満たすビューは、従来どおり更新可能とみなされます。

規則 説明

一般規則

結合ビューに対するINSERTUPDATEまたはDELETE操作は、基礎となる実表を一度に1つしか変更できません。

UPDATE規則

結合ビューの更新可能な列はすべて、キー保存表の列にマップする必要があります。キー保存表については、「キー保存表」を参照してください。ビューの定義にWITH CHECK OPTION句が使用されている場合は、すべての結合列および繰返し表の列はいずれも更新できません。

DELETE規則

結合の中にキー保存表が1つしかない場合には、結合ビューから行を削除できます。このキー保存表は、FROM句で繰り返すことができます。ビューの定義にWITH CHECK OPTION句が使用されていて、キー保存表が繰り返される場合は、そのビューから行を削除できません。

INSERT規則

INSERT文では、明示的にも暗黙的にも非キー保存表の列を参照しないでください。結合ビューの定義にWITH CHECK OPTION句が使用されている場合は、INSERT文を使用できません。

結合ビュー内の列が従来どおり更新可能かどうかを示すデータ・ディクショナリ・ビューがあります。これらのビューの詳細は、「UPDATABLE_COLUMNSビューの使用」を参照してください。

注意:

結合ビューが従来どおり更新可能かどうかについては、いくつかのその他の制限と条件が影響します。これらの制限と条件については、『Oracle Database SQL言語リファレンス』CREATE VIEW文の説明を参照してください。

ビューが従来どおり更新可能でない場合は、そのビューにINSTEAD OFトリガーを作成して更新可能にできます。トリガーの詳細は、『Oracle Database PL/SQL言語リファレンス』を参照してください。

また、ビューが別のネストされたビュー上の結合である場合は、そのネストされたビューをトップレベル・ビューにマージ可能である必要があります。マージ可能なビューとマージ不可能なビューの詳細、およびオプティマイザによってビューを参照する文が最適化される方法の概要は、『Oracle Database SQLチューニング・ガイド』を参照してください。

ここでは、従来どおり更新可能な結合ビューの規則の例を示し、キー保存表について説明します。それぞれの例は、表に主キーと外部キーを明示的に定義した場合、または一意索引を定義した場合にのみ動作します。次の文は、empおよびdeptの制約が適切に設定された表定義を作成します。

CREATE TABLE dept (
      deptno        NUMBER(4) PRIMARY KEY,
      dname         VARCHAR2(14),
      loc           VARCHAR2(13));
 
CREATE TABLE emp (
      empno        NUMBER(4) PRIMARY KEY,
      ename        VARCHAR2(10),
      job          VARCHAR2(9),
      mgr          NUMBER(4),
      sal          NUMBER(7,2),
      comm         NUMBER(7,2),
      deptno       NUMBER(2),
      FOREIGN KEY (DEPTNO) REFERENCES DEPT(DEPTNO));

また、前述の例の主キーと外部キーの制約を省略し、dept(deptno)UNIQUE INDEXを作成した場合でも、後続の例は動作可能です。

次の文は、例で参照されるemp_dept結合ビューを作成します。

CREATE VIEW emp_dept AS
      SELECT emp.empno, emp.ename, emp.deptno, emp.sal, dept.dname, dept.loc
      FROM emp, dept
      WHERE emp.deptno = dept.deptno
         AND dept.loc IN ('DALLAS', 'NEW YORK', 'BOSTON');

24.1.5.2 キー保存表

キー保存表の概念は、結合ビューを更新するうえでの制限を理解するために重要です。表のすべてのキーが結合の結果のキーでもある場合、その表はキー保存になります。つまり、キー保存表とは、結合後もそのキーを保存している表のことです。

注意:

表をキー保存にするために、表の1つ以上のキーを選択する必要はありません。1つ以上のキーを選択した場合に、そのキーが結合の結果のキーであれば十分です。

表のキー保存特性は、表内の実際のデータには依存しません。これは、そのスキーマの特性です。たとえば、emp表で各部門に多くても1人の従業員しか含まれていない場合、empdeptの結合の結果ではdeptnoは一意ですが、deptはキー保存表ではありません。

emp_deptからすべての行を選択すると、結果は次のようになります。

EMPNO      ENAME      DEPTNO  DNAME          LOC 
---------- ---------- ------- -------------- -----------
      7782 CLARK           10 ACCOUNTING     NEW YORK
      7839 KING            10 ACCOUNTING     NEW YORK
      7934 MILLER          10 ACCOUNTING     NEW YORK
      7369 SMITH           20 RESEARCH       DALLAS
      7876 ADAMS           20 RESEARCH       DALLAS
      7902 FORD            20 RESEARCH       DALLAS
      7788 SCOTT           20 RESEARCH       DALLAS
      7566 JONES           20 RESEARCH       DALLAS
8 rows selected.

このビューでは、empnoemp表のキー、および結合の結果のキーでもあるため、empがキー保存表です。deptnodept表のキーですが、結合のキーではないため、deptはキー保存表ではありません

24.1.5.3 DML文と結合ビューのルール

一般規則では、結合ビューにおいて、UPDATEINSERTまたはDELETE文では、基礎となる実表を1つしか変更できません。

24.1.5.3.1 UPDATE文と結合ビュー

例を使用して、結合ビューを変更できるUPDATE文について説明します。

次の例は、emp_deptビューを正常に変更するUPDATE文を示したものです。

UPDATE emp_dept
     SET sal = sal * 1.10 
     WHERE deptno = 10;

次に示すUPDATE文は、emp_deptビューには使用できません。

UPDATE emp_dept
     SET loc = 'BOSTON'
     WHERE ename = 'SMITH';

この文はdept実表を変更しようとしますが、dept表はemp_deptビューのキー保存表でないため、エラー番号ORA-01779キー保存されていない表にマップする列は変更できません」が出力され、文を実行できません。

一般に、結合ビューの更新可能な列はすべて、キー保存表の列にマップする必要があります。ビューの定義にWITH CHECK OPTION句が使用されている場合は、すべての結合列およびビューで2回以上参照されている表から取得したすべての列はいずれも更新できません。

したがって、たとえばemp_deptビューの定義にWITH CHECK OPTIONが使用されている場合、次に示すUPDATE文は失敗します。

UPDATE emp_dept
     SET deptno = 10
     WHERE ename = 'SMITH';

結合列を更新しようとするため、この文は失敗となります。

関連項目:

UPDATE文の構文と詳細は、『Oracle Database SQL言語リファレンス』を参照してください

24.1.5.3.2 DELETE文と結合ビュー

ほとんどの結合ビューについて、結合にキー保存表が1つしか含まれていない場合にのみ削除が成功します。このキー保存表は、FROM句で繰り返すことができます。

次のDELETE文は、emp_deptビューに対して動作します。

DELETE FROM emp_dept
     WHERE ename = 'SMITH';

emp_deptビューに対するこのDELETE文は、実表empに対するDELETE操作に変換でき、表empは結合ビュー内の唯一のキー保存表であるため、この文は有効です。

次のビューでは、2つのキー保存表がありますが、同じ表であるため、DELETE操作を実行できます。つまり、キー保存表が繰り返されています。この場合、この削除文は、FROMリストの最初の表(この例では、e1)で操作されます。

CREATE VIEW emp_emp AS
     SELECT e1.ename, e2.empno, e2.deptno
     FROM emp e1, emp e2
     WHERE e1.empno = e2.empno;

ビューの定義にWITH CHECK OPTION句が使用されていて、キー保存表が繰り返される場合は、そのビューから行を削除できません。

CREATE VIEW emp_mgr AS
     SELECT e1.ename, e2.ename mname
     FROM emp e1, emp e2
     WHERE e1.mgr = e2.empno
     WITH CHECK OPTION;

注意:

DELETE文は、その文のWHERE句内で結合条件としてビューの作成に使用したものと同じ列を使用する場合、結合内に異なるキー保存表が存在していても削除操作に成功します。この場合、DELETE文はFROMリストの最初の表で機能するので、FROMリストの表はWHERE句の表と異なってもかまいません。

関連項目:

DELETE文の構文と詳細は、『Oracle Database SQL言語リファレンス』を参照してください

24.1.5.3.3 INSERT文と結合ビュー

例を使用して、結合ビューを変更できるINSERT文について説明します。

emp_deptビューに対する次のINSERT文は正常に動作します。

INSERT INTO emp_dept (ename, empno, deptno)
   VALUES ('KURODA', 9010, 40);

変更されるキー保存実表は1つのみであり(emp)、40はdept表の有効なdeptnoであるため(つまり、emp表に対するFOREIGN KEY整合性制約を満たすため)、この文は動作します。

次のINSERT文は、実表empに対するUPDATEが失敗するのと同じ理由で失敗します。つまり、77というdeptnoが存在しないため、emp表に対するFOREIGN KEY整合性制約に違反します。

INSERT INTO emp_dept (ename, empno, deptno)
   VALUES ('KURODA', 9010, 77);

次のINSERT文はエラー番号ORA-01776結合ビューを介して複数の実表を変更できません。」が出力されて失敗します。

INSERT INTO emp_dept (empno, ename, loc)
   VALUES (9010, 'KURODA', 'BOSTON');

INSERTは、暗黙的にも明示的にも、非キー保存表の列を参照できません。結合ビューの定義にWITH CHECK OPTION句が使用されている場合は、その結合ビューに対してINSERTを実行できません。

関連項目:

INSERT文の構文と詳細は、『Oracle Database SQL言語リファレンス』を参照してください

24.1.5.4 外部結合が含まれるビューの更新

外部結合が含まれるビューは、変更可能な場合もあります。

次に例を示します。

CREATE VIEW emp_dept_oj1 AS
    SELECT empno, ename, e.deptno, dname, loc
    FROM emp e, dept d
    WHERE e.deptno = d.deptno (+);

文:

SELECT * FROM emp_dept_oj1;

結果:

EMPNO   ENAME      DEPTNO  DNAME          LOC         
------- ---------- ------- -------------- -------------
7369    SMITH      40      OPERATIONS     BOSTON       
7499    ALLEN      30      SALES          CHICAGO      
7566    JONES      20      RESEARCH       DALLAS       
7654    MARTIN     30      SALES          CHICAGO      
7698    BLAKE      30      SALES          CHICAGO      
7782    CLARK      10      ACCOUNTING     NEW YORK     
7788    SCOTT      20      RESEARCH       DALLAS       
7839    KING       10      ACCOUNTING     NEW YORK     
7844    TURNER     30      SALES          CHICAGO      
7876    ADAMS      20      RESEARCH       DALLAS       
7900    JAMES      30      SALES          CHICAGO      
7902    FORD       20      RESEARCH       DALLAS       
7934    MILLER     10      ACCOUNTING     NEW YORK     
7521    WARD       30      SALES          CHICAGO      
14 rows selected.

emp_dept_oj1emp実表の列は、empが結合の中のキー保存表であるため、ビューを介して変更可能です。

次のビューにも外部結合が含まれています。

CREATE VIEW emp_dept_oj2 AS
SELECT e.empno, e.ename, e.deptno, d.dname, d.loc
FROM emp e, dept d
WHERE e.deptno (+) = d.deptno;

文:

SELECT * FROM emp_dept_oj2;

結果:

EMPNO      ENAME      DEPTNO    DNAME          LOC
---------- ---------- --------- -------------- ----
7782       CLARK      10        ACCOUNTING     NEW YORK
7839       KING       10        ACCOUNTING     NEW YORK
7934       MILLER     10        ACCOUNTING     NEW YORK
7369       SMITH      20        RESEARCH       DALLAS
7876       ADAMS      20        RESEARCH       DALLAS
7902       FORD       20        RESEARCH       DALLAS
7788       SCOTT      20        RESEARCH       DALLAS 
7566       JONES      20        RESEARCH       DALLAS
7499       ALLEN      30        SALES          CHICAGO
7698       BLAKE      30        SALES          CHICAGO
7654       MARTIN     30        SALES          CHICAGO
7900       JAMES      30        SALES          CHICAGO
7844       TURNER     30        SALES          CHICAGO
7521       WARD       30        SALES          CHICAGO
                                OPERATIONS     BOSTON
15 rows selected.

このビューでは、結合の結果のempno列がNULL(前述のSELECT文の最終行)になる可能性があるため、empはキー保存表ではなくなります。したがって、このビューでは、UPDATEDELETEおよびINSERT操作を実行できません。

別のネストされたビュー上の外部結合を含むビューの場合は、表を含むビューがその外部ビューの最上位まですべてマージされる場合に、その表はキー保存になります。外部結合されているビューは現在、単純な場合にのみマージされます。次に例を示します。

SELECT col1, col2, ... FROM T;

ビューのSELECTリストには式がありません。

ビューが更新可能かどうか不確かな場合は、USER_UPDATABLE_COLUMNSビューから選択することで確認できます。次に例を示します。

SELECT owner, table_name, column_name, updatable FROM USER_UPDATABLE_COLUMNS 
     WHERE TABLE_NAME = 'EMP_DEPT_VIEW';

ここでは、次のような出力が返されます。

OWNER       TABLE_NAME      COLUMN_NAM      UPD
----------  ----------      ----------      ---
SCOTT       EMP_DEPT_V      EMPNO           NO
SCOTT       EMP_DEPT_V      ENAME           NO
SCOTT       EMP_DEPT_V      DEPTNO          NO
SCOTT       EMP_DEPT_V      DNAME           NO
SCOTT       EMP_DEPT_V      LOC             NO
5 rows selected.

24.1.5.5 UPDATABLE_COLUMNSビューの使用

従来どおり更新可能な結合ビューを識別する際に、このビューのセットが役立ちます。

ビュー 説明

DBA_UPDATABLE_COLUMNS

変更可能なすべての表とビューのすべての列が表示されます。

ALL_UPDATABLE_COLUMNS

ユーザーがアクセス可能で変更可能なすべての表とビューのすべての列が表示されます。

USER_UPDATABLE_COLUMNS

ユーザーのスキーマ内で変更可能なすべての表とビューのすべての列が表示されます。

次に、emp_deptビュー内の更新可能な列を示します。

SELECT COLUMN_NAME, UPDATABLE
      FROM USER_UPDATABLE_COLUMNS
      WHERE TABLE_NAME = 'EMP_DEPT';

COLUMN_NAME                    UPD
------------------------------ ---
EMPNO                          YES
ENAME                          YES
DEPTNO                         YES
SAL                            YES
DNAME                          NO
LOC                            NO

6 rows selected.

関連項目:

更新可能な列のビューの詳細は、『Oracle Databaseリファレンス』を参照してください

24.1.6 ビューの変更

ALTER VIEW文は、無効なビューを明示的に再コンパイルする場合にのみ使用します。

ビューの定義を変更する場合は、「ビューの置換」を参照してください。

ALTER VIEW文を使用すると、実際に使用する前に再コンパイル・エラーを調べることができます。ビューの実表の1つを変更したとき、変更がビューまたはそれに依存する他のオブジェクトに影響しないようにするには、そのビューを明示的に再コンパイルします。

ALTER VIEW文を使用するには、そのビューが自分のスキーマに含まれているか、またはALTER ANY TABLEシステム権限を持っている必要があります。

関連項目:

ALTER VIEW文の構文と詳細は、『Oracle Database SQL言語リファレンス』を参照してください

24.1.7 ビューの削除

ビューを削除するには、DROP VIEW文を使用します。

自分のスキーマにあるビューはすべて削除できます。別のユーザーのスキーマ内にあるビューを削除するには、DROP ANY VIEWシステム権限が必要です。ビューを削除するには、DROP VIEW文を使用します。たとえば、次の文はemp_deptビューを削除します。

DROP VIEW emp_dept;

関連項目:

DROP VIEW文の構文と詳細は、『Oracle Database SQL言語リファレンス』を参照してください

24.2 順序の管理

順序の作成、順序の変更、順序の使用および順序の削除などのタスクを実行できます。

24.2.1 順序の概要

順序とは、複数のユーザーが一意の整数を生成するために使用できるデータベース・オブジェクトです。順序ジェネレータは順序番号を生成し、一意主キーの自動的な生成、および複数の行または表の間のキーの調整に使用できます。

順序がない場合、シーケンシャル値はプログラムによって生成されるのみです。新しい主キー値は、最後に生成された値を選択し、その値を増分することによって取得できます。この方法では、トランザクション中のロックが必要となるため、複数のユーザーが主キーの次の値を待機することになり、この待機をシリアライズと呼びます。開発者がこのような構成メンバーをアプリケーションに設定している場合は、順序へのアクセスに置き換えるように薦めてください。順序によってシリアライズが解消され、アプリケーションの同時実行性が改善されます。

関連項目:

順序の概要については、『Oracle Database概要』を参照してください。

24.2.2 順序の作成

順序を作成するには、CREATE SEQUENCE文を使用します。

自分のスキーマに順序を作成するには、CREATE SEQUENCEシステム権限が必要です。別のユーザーのスキーマ内に順序を作成するには、CREATE ANY SEQUENCE権限が必要です。

たとえば、次の文は、emp表のempno列に対して従業員番号を生成するために使用する順序を作成します。

CREATE SEQUENCE emp_sequence
      INCREMENT BY 1
      START WITH 1
      NOMAXVALUE
      NOCYCLE
      CACHE 10;

複数のパラメータを指定して、順序の機能を制御できます。これらのパラメータを使用して、順序の昇順または降順、順序の開始点、最大値と最小値、および順序値の間隔を指定できます。NOCYCLEオプションは、順序が最大値または最小値に達すると、それ以上の値を生成できなくなることを示します。

CACHE句は順序番号により高速にアクセスできるように、順序番号の集合をメモリーに事前割当てし、維持します。キャッシュ内の最後の順序番号が使用されると、別の順序の集合がキャッシュ内に読み込まれます。

順序番号の集合をキャッシュする場合に、順序番号がスキップされることがあります。たとえば、インスタンスが異常停止すると(たとえばインスタンス障害が発生したり、SHUTDOWN ABORT文が発行されたりすると)、キャッシュされているが使用されていない順序番号は失われます。また、使用されても保存されなかった順序番号も失われます。さらに、エクスポートとインポートの後、データベースがキャッシュされた順序番号をスキップすることもあります。詳細は、『Oracle Databaseユーティリティ』を参照してください。

関連項目:

  • CREATE SEQUENCE文の構文については、『Oracle Database SQL言語リファレンス』を参照してください

  • Oracle Real Application Clusters環境で順序を使用する方法については、『Oracle Real Application Clusters管理およびデプロイメント・ガイド』を参照してください。

24.2.3 順序の変更

順序を変更するには、ALTER SEQUENCE文を使用します。

順序を変更するには、スキーマに順序が含まれている必要があり、順序に対するALTERオブジェクト権限またはALTER ANY SEQUENCEシステム権限が必要です。順序を変更して、順序開始番号以外の順序番号の生成方法を定義するパラメータを変更できます。順序の開始点を変更するには、順序を削除し、再作成します。

たとえば、次の文は、emp_sequenceを変更します。

ALTER SEQUENCE emp_sequence
    INCREMENT BY 10
    MAXVALUE 10000
    CYCLE
    CACHE 20;

関連項目:

ALTER SEQUENCE文の構文と詳細は、『Oracle Database SQL言語リファレンス』を参照してください

24.2.4 順序の使用

複数のユーザーが順序にアクセスして増分できます。

順序を使用するには、順序が自分のスキーマに含まれているか、または別のユーザーの順序に対するSELECTオブジェクト権限が付与されている必要があります。定義済の順序は、複数のユーザー(該当する順序を含む順序に対するSELECTオブジェクト権限を持つユーザー)が待機せずにアクセスおよび増分できます。順序を増分したトランザクションの完了を待機せずに、その順序は再び増分されます。

次の各項の例では、マスター/ディテール表の関係における順序の使用方法について説明します。顧客からの注文の情報を格納する2つの表orders_tab(マスター表)およびline_items_tab(ディテール表)で部分的に構成される注文入力システムを想定します。order_seqという名前の順序が、次の文で定義されます。

CREATE SEQUENCE Order_seq
    START WITH 1
    INCREMENT BY 1
    NOMAXVALUE
    NOCYCLE
    CACHE 20;

24.2.4.1 順序の参照

順序は、NEXTVALおよびCURRVAL疑似列を使用して、SQL文内で参照できます。それぞれの新しい順序番号は、順序の疑似列NEXTVALへの参照によって生成され、現行の順序番号は、疑似列CURRVALを使用して繰り返し参照できます。

NEXTVALおよびCURRVALは、予約語またはキーワードではなく、SELECTINSERTまたはUPDATEのようなSQL文の中で疑似列名として使用できます。

24.2.4.1.1 NEXTVALを使用した順序番号の生成

順序番号を生成して使用するには、SQL文でseq_name.NEXTVALを参照します。

たとえば、顧客からの発注を受けると想定します。順序番号は、値のリストの中で参照できます。次に例を示します。

INSERT INTO Orders_tab (Orderno, Custno)
    VALUES (Order_seq.NEXTVAL, 1032);

または、順序番号は、UPDATE文のSET句の中で参照できます。次に例を示します。

UPDATE Orders_tab
    SET Orderno = Order_seq.NEXTVAL
    WHERE Orderno = 10112;

順序番号は、問合せまたは副問合せのSELECTの最も外側でも参照できます。次に例を示します。

SELECT Order_seq.NEXTVAL FROM dual;

定義されているように、order_seq.NEXTVALへの最初の参照が値1を返します。order_seq.NEXTVALを参照する後続の各文は、次の順序番号(2、3、4、. . .)を生成します。疑似列NEXTVALは、必要に応じた数の新しい順序番号を生成するために使用されます。ただし、各行に生成される順序番号は1つのみです。つまり、1つの文でNEXTVALが複数回参照される場合、最初の参照によって次の番号が生成され、文の中のすべての後続の参照によって同じ番号が返されます。

生成された順序番号は、その番号を生成したセッションに対してのみ使用可能です。トランザクションのコミットまたはロールバックには関係なく、order_seq.NEXTVALを参照する他のユーザーは一意の値を取得します。2人のユーザーが同時に同じ順序にアクセスしている場合、他方のユーザーも順序番号を生成しているため、各ユーザーが受け取る順序番号に食い違いが生じる可能性があります。

24.2.4.1.2 CURRVALを使用した順序番号の使用

自分のセッションの現在の順序値を使用または参照するには、SQL文でseq_name.CURRVALを参照します。

現行のユーザー・セッション(現行または既存のトランザクション内)でseq_name.NEXTVALが参照された場合のみ、CURRVALが使用されます。CURRVALは、同一文内で複数回の場合を含め、必要な回数だけ参照できます。次の順序番号は、NEXTVALが参照されると生成されます。前述の例を続けると、注文の明細項目を挿入することで、顧客からの発注を完了します。

INSERT INTO Line_items_tab (Orderno, Partno, Quantity)
    VALUES (Order_seq.CURRVAL, 20321, 3);

INSERT INTO Line_items_tab (Orderno, Partno, Quantity)
    VALUES (Order_seq.CURRVAL, 29374, 1);

前項で指定したINSERT文が、新しい順序番号347を生成した場合、この項の文で挿入された両方の行は注文番号347の行を挿入します。

24.2.4.1.3 NEXTVALおよびCURRVALの使用と制限事項

CURRVALおよびNEXTVALは特定の場所で使用可能で、その使用には制限が適用されます。

CURRVALおよびNEXTVALは、次の場所で使用できます。

  • INSERT文のVALUES

  • SELECT文のSELECTリスト

  • ビューの問合せまたはマテリアライズド・ビューの問合せ

    ただし、マテリアライズド・ビューの問合せでCURRVALおよびNEXTVALを使用すると、マテリアライズド・ビューが複雑になります。そのため、高速リフレッシュできません。

  • UPDATE文のSET

CURRVALおよびNEXTVALは、次の場所では使用できません。

  • 副問合せ

  • DISTINCT演算子を指定したSELECT

  • GROUP BYまたはORDER BY句を指定したSELECT

  • UNIONINTERSECTまたはMINUS集合演算子を指定した別のSELECT文と組み合せたSELECT

  • SELECT文のWHERE

  • CHECK制約の条件

24.2.4.2 順序番号のキャッシュ

順序番号のキャッシュによりアクセス時間を改善できます。

24.2.4.2.1 順序番号のキャッシュについて

順序番号は、システム・グローバル領域(SGA)内の順序キャッシュに保持できます。順序キャッシュ内の順序番号へのアクセスは、順序番号をディスクから読み込むより高速です。

順序キャッシュは、複数のエントリで構成されています。各エントリには、単一の順序の順序番号を多数保持できます。

すべての順序番号に高速にアクセスするには、次のガイドラインに従ってください。

  • 順序キャッシュが、アプリケーションによって同時に使用されるすべての順序を保持できるようにしてください。

  • 順序キャッシュ内に保持された各順序の値の数を増やしてください。

24.2.4.2.2 順序キャッシュ内のエントリの数

アプリケーションが順序キャッシュ内の順序にアクセスする場合、順序番号は高速に読み込まれます。ただし、アプリケーションがキャッシュ内にない順序にアクセスする場合は、順序番号が使用される前に、順序がディスクからキャッシュに読み込まれる必要があります。

アプリケーションが多数の順序を同時に使用する場合は、順序キャッシュの大きさが不足して、すべての順序を保持できないことがあります。このような場合、順序番号へのアクセスにはディスク読取りが頻繁に必要になります。すべての順序に高速にアクセスするには、キャッシュに十分なエントリを用意し、アプリケーションが同時に使用するすべての順序を保持してください。

24.2.4.2.3 各順序キャッシュ・エントリ内の値の数

順序が順序キャッシュに読み込まれるとき、キャッシュ・エントリに順序値が生成および格納されます。その後、これらの値に高速にアクセスできます。

キャッシュに格納される順序値の数は、CREATE SEQUENCE文のCACHEパラメータによって決まります。このパラメータのデフォルト値は20です。

次のCREATE SEQUENCE文はseq2順序を作成し、SEQUENCEキャッシュ内に50個の順序値を格納します。

CREATE SEQUENCE seq2
    CACHE 50;

次に、seq2の最初の50個の値がキャッシュから読み込まれます。51番目の値がアクセスされると、次の50個の値がディスクから読み込まれます。

CACHEに上限を選択することにより、ディスクから順序キャッシュへの読取りを減らし、より長く連続する順序番号にアクセスできます。ただし、インスタンス障害が発生した場合は、キャッシュ内のすべての順序値が失われます。エクスポートの実行中にトランザクションが順序番号へのアクセスを続ける場合、エクスポートとインポートの後で、キャッシュされた順序番号がスキップされることもあります。

CREATE SEQUENCE文の中でNOCACHEオプションを使用する場合、順序値は順序キャッシュに格納されません。この場合は、順序にアクセスするたびにディスク読取りが必要となります。このようなディスク読取りにより、順序へのアクセスが遅くなります。次のCREATE SEQUENCE文はSEQ3順序を作成しますが、その値をキャッシュ内に格納しません。

CREATE SEQUENCE seq3
    NOCACHE;

24.2.5 順序の削除

不要になった順序は、DROP SEQUENCE文を使用して削除できます。

自分のスキーマ内の順序はどれでも削除できます。別のスキーマ内の順序を削除するには、DROP ANY SEQUENCEシステム権限が必要です。たとえば、次の文はorder_seq順序を削除します。

DROP SEQUENCE order_seq;

順序を削除すると、その定義がデータ・ディクショナリから削除されます。順序のシノニムはそのまま残りますが、参照時にエラーが返されます。

関連項目:

DROP SEQUENCE文の構文と詳細は、『Oracle Database SQL言語リファレンス』を参照してください

24.3 シノニムの管理

シノニムの作成、シノニムの使用およびシノニムの削除などのタスクを実行できます。

24.3.1 シノニムの概要

シノニムは、スキーマ・オブジェクトの別名です。

シノニムは、オブジェクトの名前および所有者をマスキングし、分散データベースのリモート・オブジェクトに対する位置の透過性を提供することで、一定レベルのセキュリティを提供できます。また、データベース・ユーザーにとって、シノニムは使いやすく、SQL文の複雑さが軽減されます。

シノニムを使用することで、基礎となるオブジェクトの名前変更または移動が可能になります。その場合、シノニムの再定義のみで、そのシノニムに基づくアプリケーションは変更しなくてもそのまま機能します。

パブリック・シノニムとプライベート・シノニムの両方を作成できます。パブリック・シノニムはPUBLICという名前の特別なユーザー・グループによって所有され、データベース内のすべてのユーザーがアクセスできます。プライベート・シノニムは、特定のユーザーのスキーマ内に含まれており、そのユーザーおよび基礎となるオブジェクトの権限受領者のみが使用できます。

シノニム自体は安全ではありません。シノニムのオブジェクト権限を付与した場合、実際には基礎となるオブジェクトの権限を付与することになり、そのシノニムはGRANT文でオブジェクトの別名としてのみ機能します。

関連項目:

シノニムの詳細は、『Oracle Database概要』を参照してください。

24.3.2 シノニムの作成

シノニムを作成するには、CREATE SYNONYM文を使用します。

自分のスキーマに新しいプライベート・シノニムを作成するには、CREATE SYNONYMシステム権限が必要です。別のユーザーのスキーマ内にプライベート・シノニムを作成するには、CREATE ANY SYNONYM権限が必要です。パブリック・シノニムを作成するには、CREATE PUBLIC SYNONYMシステム権限が必要です。

シノニムを作成するときには、CREATE SYNONYM文を正常に実行するために、基礎となるスキーマ・オブジェクトは必要なく、また、そのオブジェクトにアクセスする権限も不要です。次の文は、jwardのスキーマに含まれるemp表のパブリック・シノニムpublic_empを作成します。

CREATE PUBLIC SYNONYM public_emp FOR jward.emp

リモート・プロシージャまたはファンクションのシノニムを作成する場合は、そのリモート・プロシージャまたはファンクションのスキーマ名でリモート・オブジェクトを修飾する必要があります。また、リモート・オブジェクトが存在するデータベースに、ローカル・パブリック・シノニムを作成できますが、この場合は、プロシージャまたはファンクションへの後続のすべてのコールに、そのデータベース・リンクを含める必要があります。

関連項目:

CREATE SYNONYM文の構文と詳細は、『Oracle Database SQL言語リファレンス』を参照してください

24.3.3 DML文でのシノニムの使用

シノニムは、そのシノニムの基礎となるオブジェクトを参照するのと同じ方法で、DML文で参照できます。

基礎となるオブジェクトへのアクセスに必要な権限が、明示的に、使用可能なロールから、またはPUBLICから付与されている場合は、自分のスキーマまたはパブリック・シノニムに含まれるプライベート・シノニムを正常に使用できます。また、基礎となるオブジェクトについて必要なオブジェクト権限が付与されている場合は、別のスキーマ内のプライベート・シノニムを参照することもできます。

付与されているオブジェクト権限のみを使用して、別のユーザーのシノニムを参照できます。たとえば、jward.emp表に対するSELECT権限のみがあるときに、シノニムjward.employeejward.empに対して作成された場合は、jward.employeeシノニムの問合せはできますが、jward.employeeシノニムを使用した行の挿入はできません。

たとえば、employeeというシノニムが表またはビューを参照する場合は、次の文が有効になります。

INSERT INTO employee (empno, ename, job)
    VALUES (emp_sequence.NEXTVAL, 'SMITH', 'CLERK');

fire_empというシノニムがスタンドアロン・プロシージャまたはパッケージ・プロシージャを参照する場合は、それをコマンドで実行できます。

EXECUTE Fire_emp(7344);

24.3.4 シノニムの削除

不要になったシノニムを削除するには、DROP SYNONYM文を使用します。プライベート・シノニムを削除する場合は、PUBLICキーワードを省略します。パブリック・シノニムを削除する場合は、PUBLICキーワードを指定します。

自分のスキーマ内のプライベート・シノニムはどれでも削除できます。別のユーザーのスキーマ内にあるプライベート・シノニムを削除するには、DROP ANY SYNONYMシステム権限が必要です。パブリック・シノニムを削除するには、DROP PUBLIC SYNONYMシステム権限が必要です。

たとえば、次の文はプライベート・シノニムempを削除します。

DROP SYNONYM emp;

次の文は、パブリック・シノニムpublic_empを削除します。

DROP PUBLIC SYNONYM public_emp;

シノニムを削除すると、その定義がデータ・ディクショナリから削除されます。削除したシノニムを参照するオブジェクトはすべて残ります。ただし、それらのオブジェクトは無効(使用不可)になります。シノニムの削除が他のスキーマ・オブジェクトに与える影響の詳細は、「オブジェクト依存性の管理」を参照してください。

関連項目:

DROP SYNONYM文の構文と詳細は、『Oracle Database SQL言語リファレンス』を参照してください

24.4 ビュー、順序およびシノニムのデータ・ディクショナリ・ビュー

データ・ディクショナリ・ビューを問い合せて、ビュー、シノニムおよび順序に関する情報を取得できます。

次のビューには、ビュー、シノニムおよび順序に関する情報が表示されます。

ビュー 説明

DBA_VIEWS

ALL_VIEWS

USER_VIEWS

DBAビューには、データベース内のすべてのビューが表示されます。ALLビューは、現行ユーザーがアクセスできるビューのみに制限されます。USERビューは、現行ユーザーが所有するビューのみに制限されます。

DBA_SYNONYMS

ALL_SYNONYMS

USER_SYNONYMS

これらのビューには、シノニムが表示されます。

DBA_SEQUENCES

ALL_SEQUENCES

USER_SEQUENCES

これらのビューには、順序が表示されます。

DBA_UPDATABLE_COLUMNS

ALL_UPDATABLE_COLUMNS

USER_UPDATABLE_COLUMNS

これらのビューには、更新可能な結合ビューの列がすべて表示されます。