この章では、Oracleオブジェクトがデータベースの他の部分と関連してどのように機能するか、またDML操作およびDDL操作をどのように実行するかについて説明します。内容は次のとおりです。
オブジェクト型に対する権限は、システム・レベルおよびスキーマ・オブジェクト・レベルで存在します。
この項の内容は次のとおりです。
Oracleでは、オブジェクト型に次のシステム権限を定義します。
The RESOURCE
ロールには、CREATE
TYPE
システム権限が含まれます。DBAロールには、前述のすべての権限が含まれます。
オブジェクト型には、2つのスキーマ・オブジェクト権限が適用されます。
オブジェクト型にEXECUTE
権限があると、その型を次のように使用できます。
表の定義
リレーショナル表の列の定義
オブジェクト型の変数またはパラメータの宣言
EXECUTE
は、コンストラクタなどの型のメソッドを起動します。
UNDER
は、権限が与えられた型またはビューの下にサブタイプまたはサブビューを作成します。
権限付与者が直系のスーパータイプまたはスーパービューについてUNDER
権限をWith
Grant
Option
付きで持っている場合のみ、サブタイプまたはサブビューに対するUNDER
権限が付与されます。
WITH
HIERARCHY
OPTION
句は、オブジェクトのすべてのサブオブジェクトについて指定されたオブジェクト権限を付与します。このオプションが意味を持つのは、オブジェクト・ビュー階層内のオブジェクト・ビューにSELECT
オブジェクト権限が付与されている場合のみです。この場合、権限が付与されているビューのサブビューすべてに、権限が適用されます。
次の場合は、前述の項で説明した権限の他に、特定の権限が必要です。
新しい型または表を定義するには、EXECUTE
ANY
TYPE
システム権限、または使用する型に対するEXECUTE
オブジェクト権限が必要です。これらの権限は、ロールを介してではなく、明示的に付与される必要があります。
新しい型または表へのアクセス権限を他のユーザーに付与するには、Grant Option
を含む適切なEXECUTE
オブジェクト権限、またはオプションWITH
ADMIN
OPTION
を含むEXECUTE
ANY
TYPE
システム権限が必要です。これらの権限は、ロールを介してではなく、明示的に付与される必要があります。
CREATE
SESSION
ロールおよびRESOURCE
ロールを持つUSER1
、USER2
、USER3
という3人のユーザーがいると想定します。
USER1
は、USER1
スキーマ内で次のDDLを実行します。
CONNECT user1
Enter password: password1
CREATE TYPE type1 AS OBJECT ( attr1 NUMBER );
/
CREATE TYPE type2 AS OBJECT ( attr2 NUMBER );
/
GRANT EXECUTE ON type1 TO user2;
GRANT EXECUTE ON type2 TO user2 WITH GRANT OPTION;
USER2
は、USER2
スキーマ内で次のDDLを実行します。
CONNECT user2
Enter password: password2
CREATE TABLE tab1 OF user1.type1;
CREATE TYPE type3 AS OBJECT ( attr3 user1.type2 );
/
CREATE TABLE tab2 (col1 user1.type2 );
USER2
は、Grant Option
を含む、USER1
のTYPE2
に対するEXECUTE
権限を持っているため、次の文は正常に実行されます。
GRANT EXECUTE ON type3 TO user3; GRANT SELECT ON tab2 TO user3;
ただし、USER2
は、Grant Option
を含む、USER1.TYPE1
に対するEXECUTE
権限を持っていないため、次の文は正常に実行されません。
GRANT SELECT ON tab1 TO user3 -- incorrect statement;
USER3
は、次の処理を正常に実行できます。
CONNECT user3
Enter password: password3
CREATE TYPE type4 AS OBJECT (attr4 user2.type3);
/
CREATE TABLE tab3 OF type4;
オブジェクト型はEXECUTE
権限のみを使用しますが、オブジェクト表はリレーショナル表と同じ次のすべての権限を使用します。
同様の表権限および列権限が、オブジェクト型の表列の使用を規制します。
オブジェクト表の列を選択するには、オブジェクト表の型に対する権限は必要ありません。ただし、行全体を選択するには必要です。
例7-1に示すスキーマと問合せを考えてみます。
例7-1 型へのアクセスのSELECT権限
CREATE TYPE emp_type as object ( eno NUMBER, ename VARCHAR2(36)); / CREATE TABLE emp OF emp_type; GRANT SELECT on emp TO user1; SELECT VALUE(e) FROM emp e; SELECT eno, ename FROM emp;
どちらの問合せの場合も、Oracleはemp
表に対するユーザーのSELECT
権限をチェックします。最初の問合せの場合、データを解析するには、ユーザーはemp_type
型情報を取得する必要があります。問合せがemp_type
型にアクセスすると、ユーザーのEXECUTE
権限をチェックします。
2番目の問合せの実行は、指定された型を必要としません。そのため、型権限をチェックしません。
さらに、「例: オブジェクト型の権限」で説明したスキーマを使用して、USER3
は次の問合せを実行できます。
SELECT t.col1.attr2 from user2.tab2 t; SELECT t.attr4.attr3.attr2 FROM tab3 t;
USER3
による2つの選択では、USER3
は基礎となる型の明示的な権限を持っていませんが、型所有者および表所有者はGrant Option
を含む必要な権限を持っているため、この文は正常に実行されます。
次の要求についての権限をチェックし、ユーザーに各処理に対する権限がない場合はエラーを戻します。
REF
値を使用してオブジェクト・キャッシュ内に1つのオブジェクトを確保すると、そのオブジェクトを含むオブジェクト表に対するSELECT
権限、およびそのオブジェクト型に対するEXECUTE
権限をチェックします。
関連項目 OCIプログラムをオブジェクトとともに効果的に使用するためのヒントおよび技法は、『Oracle Call Interfaceプログラマーズ・ガイド』を参照してください。 |
既存オブジェクトの変更、またはオブジェクト・キャッシュからのオブジェクトのフラッシュを行うと、接続先オブジェクト表に対するUPDATE
権限をチェックします。新しいオブジェクトをフラッシュすると、接続先オブジェクト表に対するINSERT
権限をチェックします。
メソッドを起動すると、対応するオブジェクト型に対するEXECUTE
権限をチェックします。
型は、互いに依存するように定義できます。たとえば、employee
の1つの属性を従業員が属する部門にし、department
の1つの属性を部門を管理する従業員にするように、オブジェクト型employee
およびdepartment
を定義できます。
このように、直接的または中間の型を介して互いに依存する型を、相互依存といいます。矢印を使用して一連の型の依存関係を示す図の場合、相互依存型同士のつながりがループを形成します。
そのような循環依存を定義するには、サークルの最小限1つのセグメントにREF
を使用する必要があります。
たとえば、例7-2に示す型を定義できます。
例7-2 依存オブジェクト型の作成
CREATE TYPE department; / CREATE TYPE employee AS OBJECT ( name VARCHAR2(30), dept REF department, supv REF employee ); / CREATE TYPE emp_list AS TABLE OF employee; / CREATE TYPE department AS OBJECT ( name VARCHAR2(30), mgr REF employee, staff emp_list ); /
これは、適切な相互依存型におけるSQL DDL文の適切な順序です。これをエラーなしでコンパイルします。
例7-2のコードはdepartment
型を2回作成することに注意してください。次の文はオプションです。
CREATE TYPE department;
この文は、employee
のREF
属性が指すプレースホルダとして機能するdepartment
の不完全な宣言です。AS
OBJECT
句が省略され、属性またはメソッドがリストされていない点で、この宣言は不完全です。これらは、後述の型を完成させる完全な宣言で指定します。ここでは、department
を不完全なオブジェクト型として作成しておきます。これにより、employee
がエラーなしでコンパイルできます。
不完全な型を再定義するには、この例の最後に示すとおり、型の属性およびメソッドを指定するCREATE
TYPE
文を実行します。不完全な型が参照するすべての型を作成した後、不完全な型を再定義してください。
不完全な型をプレースホルダとして作成しない場合、その型を参照する型はコンパイルされますが、コンパイル・エラーが発生します。
たとえば、department
が存在しない場合、それを不完全な型として作成し、employee
はコンパイル・エラーになります。この場合、次回なんらかの操作がこの型にアクセスしようとした際に、employee
が再コンパイルされます。この型が依存するすべての型が作成され、その依存性が完全な場合、エラーなしでコンパイルされます。
不完全な型を使用することにより、まだ作成されていないサブタイプに対するREF
属性を格納する型も作成できます。こうしたスーパータイプを作成するには、参照するサブタイプの不完全な型を最初に作成します。完全なサブタイプは、スーパータイプ作成後に作成します。
サブタイプは、直系のスーパータイプの特殊なバージョンであるため、必然的に直系のスーパータイプとの間に明らかな依存関係を持ちます。スーパータイプを削除した後、サブタイプの削除もれが発生しないようにするために、最初にすべてのサブタイプを削除する必要があります。スーパータイプは、そのすべてのサブタイプが削除されるまで、削除できません。
不完全な型が参照するすべての型が作成されたら、不完全な型が不完全な状態を維持する必要がなくなるため、不完全な型の宣言を再定義してください。型を再定義すると、型が再コンパイルされ、システムが様々なロックを解放できるようになります。
不完全なオブジェクト型は、オブジェクト型として再定義する必要があります。オブジェクト型をコレクション型(ネストした表型または配列型)として再定義することはできません。その型を削除することはできます。
明示的に作成しなかったためにOracleによって作成される不完全な型も、再定義する必要があります。前述の例は、department
を明示的に不完全な型として作成しています。department
を明示的に不完全な型として作成しなかった場合、employee
型が(エラー付きで)コンパイルできるように、この型を明示的に不完全な型として作成します。department
の宣言は、この型を不完全な型として宣言したのがユーザーであるか、Oracleであるかにかかわらず、オブジェクト型として再定義する必要があります。
型の作成でコンパイル・エラーが発生し、その型に対してなんらかの操作(表の作成、行の挿入など)を実行しようとした場合、エラーが発生することがあります。この操作を行う前に、タイプtypename
を再コンパイルする必要があります。手動で型を再コンパイルする場合は、ALTER
TYPE
typename
COMPILE
文を実行します。型のコンパイルが正常に実行された後、操作を再試行してください。
代入可能な表または型T
の列は、T
に依存するのみでなく、T
のサブタイプにも依存します。それは、T
のサブタイプで追加されたそれぞれの属性について、非表示列が表に追加されることからもわかります。代入可能な表または列に、このサブタイプのデータが何も入っていない場合も、非表示列は追加されます。
したがって、たとえば型person_typ
の個人表はperson_typ
のみでなく、person_typ
のサブタイプであるstudent_typ
およびpart_time_student_typ
にも依存します。
依存型、表または列を持つサブタイプを削除しようとすると、DROP
TYPE
文はエラーを戻し、異常終了します。たとえば、part_time_student_typ
は、persons
表に依存しているので、削除しようとすると、エラーとなります。
依存表または依存列が存在しても、削除する型のデータが何も入っていない場合は、VALIDATE
キーワードを使用して、型を削除できます。VALIDATE
キーワードが使用されていると、指定された型のインスタンスが実際に格納されているかどうかを調べ、何も見つからなければ、型を削除します。非表示列で、型に固有の属性と関連付けられたものも削除されます。
次に示す最初のDROP
TYPE
文は正常に実行されません。part_time_student_typ
が依存表(persons
)になっているためです。ただし、persons
にpart_time_student_typ
のインスタンスが何も入っていなければ(および他の依存表または依存列のいずれも入っていなければ)、VALIDATE
キーワードにより2番目のDROP
TYPE
文は正常に実行されます。
-- Following generates an error due to presence of Persons table DROP TYPE part_time_student_typ -- incorrect statement; -- Following succeeds if there are no stored instances of part_time_student_typ DROP TYPE part_time_student_typ VALIDATE;
注意: サブタイプの削除中に、VALIDATE オプションを使用することをお薦めします。 |
DROP
TYPE
文には、FORCE
オプションもあります。このオプションは、型に依存型または依存表がある場合でも、型を削除します。存在するすべての依存型または依存表に無効のマークが付けられ、型が削除されたときにアクセス不能になるので、FORCE
オプションは慎重に使用する必要があります。依存する型が削除されたために無効になった表のデータに、再びアクセスすることはできません。こうした表に対して実行できる操作は、削除のみです。
型の変更方法の詳細は、「型進化」を参照してください。
表、ビューおよびその他の様々なスキーマ・オブジェクトについてシノニムが作成できるように、オブジェクト型についてもシノニムを定義できます。
型のシノニムは、基礎となるスキーマ・オブジェクトを場所に依存せずに参照する手段となるため、他の種類のスキーマ・オブジェクトのシノニムと同じ利点があります。パブリック・タイプのシノニムを使用するアプリケーションは、データベースのスキーマを変更せずにデプロイできます。型が定義されているスキーマの名前で型の名前を修飾する必要はありません。
関連項目 シノニムの詳細は、『Oracle Database管理者ガイド』を参照してください。 |
この項の内容は次のとおりです。
型のシノニムは、CREATE
SYNONYM
文で作成します。たとえば、これらの文はtyp1
型を作成し、次にこの型のシノニムを作成します。
-- For the synonym examples, CREATE SYNONYM and CREATE PUBLIC SYNONYM -- are granted to USER1 CREATE TYPE typ1 AS OBJECT (x number); / CREATE SYNONYM syn1 FOR typ1;
シノニムは、コレクション型についても作成できます。次の例は、ネストした表型のシノニムを作成します。
CREATE TYPE typ2 AS TABLE OF NUMBER; / CREATE SYNONYM syn2 FOR typ2;
パブリック・シノニムは、PUBLIC
キーワードを使用して作成します。
CREATE TYPE shape AS OBJECT ( name VARCHAR2(10) );
/
CREATE PUBLIC SYNONYM pub_shape FOR shape;
REPLACE
オプションを使用すると、シノニムが指す基礎となる型を別の型に変更できます。たとえば、次の文は、syn1
が指す型をtyp2
型に変更します。
CREATE OR REPLACE SYNONYM syn1 FOR typ2;
型のシノニムは、型を参照できるすべての場所で使用できます。たとえば、DDL文の中で型のシノニムを使用して、表列の型または型属性を指定できます。例7-3では、シノニムsyn1
を使用して、属性の型をtyp3
型に指定します。
例7-3 CREATE文での型のシノニムの使用
CREATE TYPE typ1 AS OBJECT (x number); / CREATE SYNONYM syn1 FOR typ1; CREATE TYPE typ3 AS OBJECT ( a syn1 ); /
次の例は、syn1
をシノニムとするオブジェクト型typ1
のコンストラクタをコールするために使用する型のシノニムsyn1
です。この文は、typ1
のオブジェクト・インスタンスを戻します。
SELECT syn1(0) FROM dual;
次の例は、syn2
がネストした表型のシノニムです。この例は、実際の型の名前のかわりにCAST
式で使用されるシノニムを示しています。
SELECT CAST(MULTISET(SELECT eno FROM USER3.EMP) AS syn2) FROM dual;
型のシノニムは、次のような文で使用できます。
DML文: SELECT
、INSERT
、UPDATE
、DELETE
、FLASHBACK
TABLE
、EXPLAIN
PLAN
およびLOCK
TABLE
DDL文: AUDIT
、NOAUDIT
、GRANT
、REVOKE
およびCOMMENT
型のシノニムを使用して型または表が作成されると、DESCRIBE
コマンドにより、これらのシノニムが表す型のかわりにシノニムが表示されます。同様に、型の名前を示すカタログ・ビュー(USER_TYPE_ATTRS
など)には、対応付けられた型のシノニムの名前が表示されます。
カタログ・ビューUSER_SYNONYMS
を問い合せると、型のシノニムの基礎となる型を確認できます。
型の宣言でシノニムを直接的または間接的に参照する型は、そのシノニムに依存します。したがって、次に示す型typ3
は、シノニムsyn1
に依存する型です。
CREATE TYPE typ3 AS OBJECT ( a syn1 ); /
DDL文でシノニムを参照する他の種類のスキーマ・オブジェクトも、これらのシノニムに依存します。型のシノニムに依存するオブジェクトは、シノニムとシノニムの基礎になる型のどちらにも依存します。
シノニムの依存関係によって、シノニムが削除できるかどうか、または名前が変更できるかどうかが決まります。また、依存スキーマ・オブジェクトも、シノニムに対する操作の影響を受けます。次の項では、これらの様々な影響について説明します。
シノニムに依存表または有効なユーザー定義型が存在しない場合にのみ、シノニムは置換できます。シノニムを置換することは、シノニムを削除してから、同じ名前で新しいシノニムを再作成することと同等です。
例7-4のように、シノニムはDROP
SYNONYM
文で削除します。
型のシノニムに依存表または有効なオブジェクト型がある場合、型のシノニムを削除するには、FORCE
オプションが必要です。FORCE
オプションは、列の実際の型が削除された場合と同様に、直接的または間接的にシノニムに依存する列を、未使用とマークします。(たとえば、シノニムを使用して、列の宣言された型の属性の型を指定すると、列は間接的にそのシノニムに依存します。)
削除されたシノニムに依存するすべてのスキーマ・オブジェクトは無効になります。これらのスキーマ・オブジェクトは、削除されたシノニムと同じ名前のローカル・オブジェクトを作成するか、または同じ名前で新しいパブリック・シノニムを作成することで、再検証できます。
型のシノニムの基礎となるベース型の削除は、シノニムの削除と同じ結果を依存オブジェクトにもたらします。
型のシノニムの名前は、RENAME
文で変更します。シノニムの名前を変更することは、シノニムを削除してから、新しい名前でシノニムを再作成することと同等です。型のシノニムに依存表または有効なオブジェクト型が存在する場合、型のシノニムの名前は変更できません。syn1
には依存するオブジェクト型が存在するため、次の例は失敗します。
RENAME syn1 TO syn3 -- invalid statement;
パブリック・シノニムが、新しいスキーマ・オブジェクトを作成するローカル・スキーマに依存表または有効なオブジェクト型を持っている場合、そのパブリック・シノニムと同じ名前のローカル・スキーマ・オブジェクトは作成できません。また、同じスキーマ内のプライベート・スキーマと同じ名前のローカル・スキーマ・オブジェクトも作成できません。
たとえば、次の例では、表shape_tab
はパブリック・シノニムpub_shape
の依存表です。この表には、型の定義でこのシノニムを使用する列があるためです。したがって、依存表と同じスキーマにパブリック・シノニムpub_shape
と同じ名前の表を作成しようとすると、正常に実行されません。
-- Following uses public synonym pub_shape CREATE TABLE shape_tab ( c1 pub_shape ); -- Following is not allowed CREATE TABLE pub_shape ( c1 NUMBER ) -- invalid statement;
オブジェクトのチューニング時には、次の点に対処する必要があります。
オブジェクトおよびオブジェクト・ビューによる実行時のCPUおよびメモリー・リソースの消費状況
実行時のメモリーおよびCPUリソースの監視方法
多数のオブジェクトの管理方法
重要なパフォーマンス要因には、次のようなものがあります。
統計を収集するDBMS_STATS
パッケージ
SQLコマンドの実行をプロファイルするtkprof
問合せ計画を生成するEXPLAIN
PLAN
関連項目 アプリケーションのパフォーマンスの測定およびチューニングの詳細は、『Oracle Databaseパフォーマンス・チューニング・ガイド』を参照してください。 |
この項では、Oracleオブジェクトのサポート機能を持ついくつかのOracleのツール製品について説明します。
この項の内容は次のとおりです。
JDeveloperは、複数層のJavaアプリケーションの作成を目的としたフル機能の統合開発環境です。このツールにより、Javaクライアント・アプリケーション、動的HTMLアプリケーション、Webおよびアプリケーション・サーバー・コンポーネントおよび業界標準モデルに基づいたデータベース・ストアド・プロシージャの開発、デバッグおよびデプロイができます。
JDeveloperの強力な機能が提供されるのは、次の分野です。
Oracle Business Components for Java
Webアプリケーションの開発
クライアント向けJavaアプリケーションの開発
データベースにおけるJava
JavaBeansによるコンポーネント・ベースの開発
シンプリファイド・データベース・アクセス
ビジュアル統合開発環境
Java言語サポート
JDeveloperはクロスプラットフォームの総合開発環境(IDE)です。Oracle Application ServerおよびOracle Databaseと緊密に統合された標準のGUIベースのJava開発環境となります。
Business Components for Java(BC4J)
標準EJBおよびCORBAデプロイメント・アーキテクチャであるOracle Business Components for Javaがサポートされるため、エンタープライズ向けのJavaビジネス・アプリケーションの開発、配布、カスタマイズが簡素化されます。Oracle Business Components for Javaは、アプリケーション・コンポーネントのフレームワークで、次に示す作業に必要な共通ファシリティすべてを管理する再利用可能なソフトウェア・ビルディング・ブロックを提供します。
リレーショナル・データベースと統合するコンポーネントのビジネス・ロジックの作成およびテスト
データの複数のSQLベース・ビューを介したビジネス・ロジックの再利用
サーブレット、JavaServer Pages(JSP)およびThin-Java Swingクライアントから行うビューへのアクセスおよび更新
配布したアプリケーションの修正を必要としないレイヤー単位のアプリケーション機能のカスタマイズ
JPublisherはユーティリティで、次のユーザー定義データベース・エンティティをユーザーのJavaプログラムで表すJavaクラスを生成します。
データベース・オブジェクト・タイプ
データベース参照(REF
)型
データベース・コレクション型(VARRAYまたはネストした表)
PL/SQLパッケージ
JPublisherにより、強力な型指定パラダイムで、データベース・オブジェクト型、参照型およびコレクション型(VARRAYまたはネストした表)をJavaクラスに対してマップする操作を指定し、カスタマイズできます。
関連項目 『Oracle Database JPublisherユーザーズ・ガイド』 |
この項では、Oracleオブジェクトのサポート機能を持ついくつかのOracleのユーティリティについて説明します。
この項の内容は次のとおりです。
エクスポート・ユーティリティおよびインポート・ユーティリティは、Oracleデータベースへ、またはOracleデータベースから、データを移動します。また、データのバックアップまたはアーカイブ、およびOracle RDBMSの異なるリリースへの移行に役立ちます。
エクスポートおよびインポートは、オブジェクト型をサポートします。エクスポートは、オブジェクト型定義および関連するすべてのデータをダンプ・ファイルに書き込みます。インポートは、ダンプ・ファイルからこれらの項目を再作成します。
SQL*Loaderユーティリティは、外部ファイルのデータを、Oracleデータベース内の表に移動します。これらのファイルには、INTEGER
、CHAR
、DATE
など基本的なスカラー・データ型で構成されるデータや、行オブジェクトや列オブジェクト(オブジェクト、コレクションまたはREF
属性)、コレクション、LOBなど複雑なユーザー定義データ型などが含まれる可能性があります。現在、SQL*Loaderはシングルレベル・コレクションのみをサポートしています。マルチレベル・コレクション(他のコレクションが要素になっているか、他のコレクションが入っているコレクション)のロードに、SQL*Loaderは使用できません。
SQL*Loaderは、SQL*Loader DDL文が入っている制御ファイルを使用して、データ・ファイルのフォーマット、内容および位置を記述します。
SQL*Loaderがデータをロードする方法は、2通りあります。
従来型パス・ロード: SQL
INSERT
文およびバインド配列バッファを使用して、データをデータベース表にロードします。
ダイレクト・パス・ロード: ダイレクト・パス・ロードAPIを使用して、SQL*Loaderクライアントのかわりに、データ・ブロックを直接データベースに書き込みます。
ダイレクト・パス・ロードはSQLインタフェースを使用しないので、関連するSQL文の処理時にオーバーヘッドが発生しません。したがって、ダイレクト・パス・ロードからは従来型パス・ロードよりも優れたパフォーマンスが得られます。
どちらの方法も、サポート対象となっているオブジェクトおよびコレクション・データ型のデータのロードに使用できます。
関連項目 SQL*Loaderの使用方法は、『Oracle Databaseユーティリティ』を参照してください。 |