Oracle Databaseでビュー、順序およびシノニムを作成および管理できます。
ビューの作成、ビューの置換、ビューの変更およびビューの削除などのタスクを実行できます。
Live SQL:
Oracle Live SQLでビューの管理に関連する例を参照および実行するには、「Oracle Live SQL: ビューの作成、置換および削除」に移動してください。
ビューとは、表または表の組合せの論理表現です。本質的には、ビューは格納された問合せです。
ビューのデータは、そのビューの基礎となる表から生成されます。この表を実表と呼びます。実表は、実際の表の場合もビュー自体の場合もあります。ビューに対して実行するすべての操作は、実際にはビューの実表に影響します。ビューの使用方法は、表の場合とほぼ同じです。通常の表と同様に、ビューに対する問合せ、更新、挿入および削除ができます。
ビューによって、他の表およびビューに常駐するデータの様々な表現(サブセットまたはスーパーセットなど)が可能です。ビューを使用すると、ユーザーの必要にあわせて調整したデータ表現ができます。
注意:
ビューの1つの特殊なタイプがエディショニング・ビューで、エディションに基づく再定義を使用したオンラインでのアプリケーションのアップグレードをサポートするためにのみ使用されるビューです。ビューの管理に関する項のここからは、エディショニング・ビューを除くすべてのビューについて説明します。エディショニング・ビューおよびエディションに基づく再定義の詳細は、『Oracle Database開発ガイド』を参照してください。
関連項目:
ビューの概要については、『Oracle Database概要』を参照してください。
ビューを作成するには、CREATE VIEW文を使用します。ビューはそれぞれ、表、マテリアライズド・ビューまたは他のビューを参照する問合せによって定義されます。FROM句で、複数の実表またはビューを指定する結合ビューを作成することもできます。
ビューを作成するには、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言語リファレンス』を参照してください
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;
更新可能な結合ビューは、UPDATE、INSERTおよびDELETE操作が可能な結合ビューです。詳細は、「結合ビューの更新」を参照してください。
ビューが作成されるときに、Oracle Databaseは最上位のビュー問合せのワイルドカード(*)を列リストに展開します。結果の問合せデータ・ディクショナリに格納され、副問合せはそのまま残されます。
展開された列リスト中の列名は引用符で囲まれており、これは、ベース・オブジェクトの列がもともと引用符付きで入力された可能性があり、問合せの構文を正しいものにするためには引用符が必要であることを示しています。
たとえば、deptビューが次のように作成される場合を想定します。
CREATE VIEW dept AS SELECT * FROM scott.dept;
データベースは、deptビューを定義している問合せを次のように格納します。
SELECT "DEPTNO", "DNAME", "LOC" FROM scott.dept;
エラー付きで作成されたビューでは、ワイルドカードは展開されません。エラーなしでビューがコンパイルされると、定義された問合せのワイルドカードが展開されます。
CREATE VIEW文に構文エラーがない場合は、そのビューを定義している問合せを実行できなくても、データベースはビューを作成できます。この場合、ビューは、エラー付きで作成されたとみなされます。
たとえば、存在しない表や既存の表の無効な列を参照するビューを作成するとき、またはビューの所有者が必要な権限を持っていないときでも、ビューを作成し、データ・ディクショナリに登録できます。ただし、そのビューは使用できません。
エラー付きのビューを作成するには、CREATE VIEW文のFORCE句を指定する必要があります。
CREATE FORCE VIEW AS ...;
デフォルトでは、エラー付きのビューはINVALIDとして作成されます。このようなビューを作成しようとすると、ビューがエラー付きで作成されたことを示すメッセージが返されます。状況が変化して無効なビューの問合せが実行可能になると、ビューは再コンパイルされ、有効(使用可能)になります。条件の変更とビューに及ぼす影響の詳細は、「オブジェクト依存性の管理」を参照してください。
ビューを置換するには、ビューを削除して再作成するか、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プログラム・ユニットも無効になります。データベースによる依存性管理の詳細は、「オブジェクト依存性の管理」を参照してください。
ビューの問合せを実行できます。ビューに対してデータ操作言語(DML)の操作も実行できますが、一部の制限があります。
ビューに対して問合せを発行したり、INSERT、UPDATEまたはDELETE文を発行するためには、そのビューに対するSELECT、READ、INSERT、UPDATEまたは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操作の制限では、次の基準がリストされている順に適用されます。
SETまたはDISTINCT演算子、GROUP BY句またはグループ関数を含む問合せが使用されている場合、そのビューによる実表への行の挿入、更新または削除はできません。WITH CHECK OPTIONが使用されていて、行を実表から選択できない場合、そのビューによる実表への行の挿入または更新はできません。DEFAULT句を持たないNOT NULL列がビューから省略されている場合、そのビューによる実表への行の挿入はできません。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
このエラー・メッセージが返されるのは、ビューは存在しているが、問合せのエラーが原因で使用禁止状態の場合です(このビューが最初に作成されたときにあったエラーか、またはビューは正常に作成されたが、基礎となるオブジェクトが変更または削除されたために、後で使用禁止状態になったかは関係ありません)。
結合ビューに対してDML文を発行するときに制限が適用されます。
更新可能な結合ビュー(変更可能な結合ビューと呼ぶこともあります)とは、SELECT文の最上位のFROM句に複数の表を含むビューで、WITH READ ONLY句の制限を受けないものです。
更新可能な結合ビューに関する規則を次の表に示します。これらの基準を満たすビューは、従来どおり更新可能とみなされます。
| 規則 | 説明 |
|---|---|
一般規則 |
結合ビューに対する |
|
結合ビューの更新可能な列はすべて、キー保存表の列にマップする必要があります。キー保存表については、「キー保存表」を参照してください。ビューの定義に |
|
結合の中にキー保存表が1つしかない場合には、結合ビューから行を削除できます。このキー保存表は、 |
|
|
結合ビュー内の列が従来どおり更新可能かどうかを示すデータ・ディクショナリ・ビューがあります。これらのビューの詳細は、「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');
キー保存表の概念は、結合ビューを更新するうえでの制限を理解するために重要です。表のすべてのキーが結合の結果のキーでもある場合、その表はキー保存になります。つまり、キー保存表とは、結合後もそのキーを保存している表のことです。
注意:
表をキー保存にするために、表の1つ以上のキーを選択する必要はありません。1つ以上のキーを選択した場合に、そのキーが結合の結果のキーであれば十分です。
表のキー保存特性は、表内の実際のデータには依存しません。これは、そのスキーマの特性です。たとえば、emp表で各部門に多くても1人の従業員しか含まれていない場合、empとdeptの結合の結果では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.
このビューでは、empnoがemp表のキー、および結合の結果のキーでもあるため、empがキー保存表です。deptnoはdept表のキーですが、結合のキーではないため、deptはキー保存表ではありません。
一般規則では、結合ビューにおいて、UPDATE、INSERTまたはDELETE文では、基礎となる実表を1つしか変更できません。
例を使用して、結合ビューを変更できる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言語リファレンス』を参照してください
ほとんどの結合ビューについて、結合にキー保存表が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言語リファレンス』を参照してください
例を使用して、結合ビューを変更できる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言語リファレンス』を参照してください
外部結合が含まれるビューは、変更可能な場合もあります。
次に例を示します。
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_oj1のemp実表の列は、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はキー保存表ではなくなります。したがって、このビューでは、UPDATE、DELETEおよび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.
従来どおり更新可能な結合ビューを識別する際に、このビューのセットが役立ちます。
| ビュー | 説明 |
|---|---|
|
変更可能なすべての表とビューのすべての列が表示されます。 |
|
ユーザーがアクセス可能で変更可能なすべての表とビューのすべての列が表示されます。 |
|
ユーザーのスキーマ内で変更可能なすべての表とビューのすべての列が表示されます。 |
次に、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リファレンス』を参照してください
ALTER VIEW文は、無効なビューを明示的に再コンパイルする場合にのみ使用します。
ビューの定義を変更する場合は、「ビューの置換」を参照してください。
ALTER VIEW文を使用すると、実際に使用する前に再コンパイル・エラーを調べることができます。ビューの実表の1つを変更したとき、変更がビューまたはそれに依存する他のオブジェクトに影響しないようにするには、そのビューを明示的に再コンパイルします。
ALTER VIEW文を使用するには、そのビューが自分のスキーマに含まれているか、またはALTER ANY TABLEシステム権限を持っている必要があります。
関連項目:
ALTER VIEW文の構文と詳細は、『Oracle Database SQL言語リファレンス』を参照してください
順序の作成、順序の変更、順序の使用および順序の削除などのタスクを実行できます。
順序とは、複数のユーザーが一意の整数を生成するために使用できるデータベース・オブジェクトです。順序ジェネレータは順序番号を生成し、一意主キーの自動的な生成、および複数の行または表の間のキーの調整に使用できます。
順序がない場合、シーケンシャル値はプログラムによって生成されるのみです。新しい主キー値は、最後に生成された値を選択し、その値を増分することによって取得できます。この方法では、トランザクション中のロックが必要となるため、複数のユーザーが主キーの次の値を待機することになり、この待機をシリアライズと呼びます。開発者がこのような構成メンバーをアプリケーションに設定している場合は、順序へのアクセスに置き換えるように薦めてください。順序によってシリアライズが解消され、アプリケーションの同時実行性が改善されます。
関連項目:
順序の概要については、『Oracle Database概要』を参照してください。
順序を作成するには、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ユーティリティ』を参照してください。
順序を変更するには、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言語リファレンス』を参照してください
複数のユーザーが順序にアクセスして増分できます。
順序を使用するには、順序が自分のスキーマに含まれているか、または別のユーザーの順序に対するSELECTオブジェクト権限が付与されている必要があります。定義済の順序は、複数のユーザー(該当する順序を含む順序に対するSELECTオブジェクト権限を持つユーザー)が待機せずにアクセスおよび増分できます。順序を増分したトランザクションの完了を待機せずに、その順序は再び増分されます。
次の各項の例では、マスター/ディテール表の関係における順序の使用方法について説明します。顧客からの注文の情報を格納する2つの表orders_tab(マスター表)およびline_items_tab(ディテール表)で部分的に構成される注文入力システムを想定します。order_seqという名前の順序が、次の文で定義されます。
CREATE SEQUENCE Order_seq
START WITH 1
INCREMENT BY 1
NOMAXVALUE
NOCYCLE
CACHE 20;
順序は、NEXTVALおよびCURRVAL疑似列を使用して、SQL文内で参照できます。それぞれの新しい順序番号は、順序の疑似列NEXTVALへの参照によって生成され、現行の順序番号は、疑似列CURRVALを使用して繰り返し参照できます。
NEXTVALおよびCURRVALは、予約語またはキーワードではなく、SELECT、INSERTまたはUPDATEのようなSQL文の中で疑似列名として使用できます。
順序番号を生成して使用するには、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人のユーザーが同時に同じ順序にアクセスしている場合、他方のユーザーも順序番号を生成しているため、各ユーザーが受け取る順序番号に食い違いが生じる可能性があります。
自分のセッションの現在の順序値を使用または参照するには、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の行を挿入します。
CURRVALおよびNEXTVALは特定の場所で使用可能で、その使用には制限が適用されます。
CURRVALおよびNEXTVALは、次の場所で使用できます。
INSERT文のVALUES句
SELECT文のSELECTリスト
ビューの問合せまたはマテリアライズド・ビューの問合せ
ただし、マテリアライズド・ビューの問合せでCURRVALおよびNEXTVALを使用すると、マテリアライズド・ビューが複雑になります。そのため、高速リフレッシュできません。
UPDATE文のSET句
CURRVALおよびNEXTVALは、次の場所では使用できません。
副問合せ
DISTINCT演算子を指定したSELECT文
GROUP BYまたはORDER BY句を指定したSELECT文
UNION、INTERSECTまたはMINUS集合演算子を指定した別のSELECT文と組み合せたSELECT文
SELECT文のWHERE句
CHECK制約の条件
順序番号のキャッシュによりアクセス時間を改善できます。
順序番号は、システム・グローバル領域(SGA)内の順序キャッシュに保持できます。順序キャッシュ内の順序番号へのアクセスは、順序番号をディスクから読み込むより高速です。
順序キャッシュは、複数のエントリで構成されています。各エントリには、単一の順序の順序番号を多数保持できます。
すべての順序番号に高速にアクセスするには、次のガイドラインに従ってください。
順序キャッシュが、アプリケーションによって同時に使用されるすべての順序を保持できるようにしてください。
順序キャッシュ内に保持された各順序の値の数を増やしてください。
アプリケーションが順序キャッシュ内の順序にアクセスする場合、順序番号は高速に読み込まれます。ただし、アプリケーションがキャッシュ内にない順序にアクセスする場合は、順序番号が使用される前に、順序がディスクからキャッシュに読み込まれる必要があります。
アプリケーションが多数の順序を同時に使用する場合は、順序キャッシュの大きさが不足して、すべての順序を保持できないことがあります。このような場合、順序番号へのアクセスにはディスク読取りが頻繁に必要になります。すべての順序に高速にアクセスするには、キャッシュに十分なエントリを用意し、アプリケーションが同時に使用するすべての順序を保持してください。
順序が順序キャッシュに読み込まれるとき、キャッシュ・エントリに順序値が生成および格納されます。その後、これらの値に高速にアクセスできます。
キャッシュに格納される順序値の数は、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;
不要になった順序は、DROP SEQUENCE文を使用して削除できます。
自分のスキーマ内の順序はどれでも削除できます。別のスキーマ内の順序を削除するには、DROP ANY SEQUENCEシステム権限が必要です。たとえば、次の文はorder_seq順序を削除します。
DROP SEQUENCE order_seq;
順序を削除すると、その定義がデータ・ディクショナリから削除されます。順序のシノニムはそのまま残りますが、参照時にエラーが返されます。
関連項目:
DROP SEQUENCE文の構文と詳細は、『Oracle Database SQL言語リファレンス』を参照してください
シノニムの作成、シノニムの使用およびシノニムの削除などのタスクを実行できます。
シノニムは、スキーマ・オブジェクトの別名です。
シノニムは、オブジェクトの名前および所有者をマスキングし、分散データベースのリモート・オブジェクトに対する位置の透過性を提供することで、一定レベルのセキュリティを提供できます。また、データベース・ユーザーにとって、シノニムは使いやすく、SQL文の複雑さが軽減されます。
シノニムを使用することで、基礎となるオブジェクトの名前変更または移動が可能になります。その場合、シノニムの再定義のみで、そのシノニムに基づくアプリケーションは変更しなくてもそのまま機能します。
パブリック・シノニムとプライベート・シノニムの両方を作成できます。パブリック・シノニムはPUBLICという名前の特別なユーザー・グループによって所有され、データベース内のすべてのユーザーがアクセスできます。プライベート・シノニムは、特定のユーザーのスキーマ内に含まれており、そのユーザーおよび基礎となるオブジェクトの権限受領者のみが使用できます。
シノニム自体は安全ではありません。シノニムのオブジェクト権限を付与した場合、実際には基礎となるオブジェクトの権限を付与することになり、そのシノニムはGRANT文でオブジェクトの別名としてのみ機能します。
関連項目:
シノニムの詳細は、『Oracle Database概要』を参照してください。
シノニムを作成するには、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言語リファレンス』を参照してください
シノニムは、そのシノニムの基礎となるオブジェクトを参照するのと同じ方法で、DML文で参照できます。
基礎となるオブジェクトへのアクセスに必要な権限が、明示的に、使用可能なロールから、またはPUBLICから付与されている場合は、自分のスキーマまたはパブリック・シノニムに含まれるプライベート・シノニムを正常に使用できます。また、基礎となるオブジェクトについて必要なオブジェクト権限が付与されている場合は、別のスキーマ内のプライベート・シノニムを参照することもできます。
付与されているオブジェクト権限のみを使用して、別のユーザーのシノニムを参照できます。たとえば、jward.emp表に対するSELECT権限のみがあるときに、シノニムjward.employeeがjward.empに対して作成された場合は、jward.employeeシノニムの問合せはできますが、jward.employeeシノニムを使用した行の挿入はできません。
たとえば、employeeというシノニムが表またはビューを参照する場合は、次の文が有効になります。
INSERT INTO employee (empno, ename, job)
VALUES (emp_sequence.NEXTVAL, 'SMITH', 'CLERK');
fire_empというシノニムがスタンドアロン・プロシージャまたはパッケージ・プロシージャを参照する場合は、それをコマンドで実行できます。
EXECUTE Fire_emp(7344);
不要になったシノニムを削除するには、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言語リファレンス』を参照してください
データ・ディクショナリ・ビューを問い合せて、ビュー、シノニムおよび順序に関する情報を取得できます。
次のビューには、ビュー、シノニムおよび順序に関する情報が表示されます。
| ビュー | 説明 |
|---|---|
|
|
|
これらのビューには、シノニムが表示されます。 |
|
これらのビューには、順序が表示されます。 |
|
これらのビューには、更新可能な結合ビューの列がすべて表示されます。 |