ヘッダーをスキップ
Oracle Database PL/SQL言語リファレンス
11g リリース1(11.1)
E05670-03
  目次
目次
索引
索引

戻る
戻る
 
次へ
次へ
 

CREATE TYPE文

CREATE TYPE文は、オブジェクト型SQLJオブジェクト型、名前付きの可変配列(VARRAY)、ネストした表型または不完全オブジェクト型の仕様部を作成するか、または置き換えます。 CREATE TYPE文およびCREATE TYPE BODY文を使用して、オブジェクト型を作成します。 CREATE TYPE文は、オブジェクト型の名前、オブジェクトの属性、メソッドおよびその他のプロパティを指定します。 CREATE TYPE BODY文には、型を実装するメソッドのコードが含まれています。


注意:

  • 型仕様部で属性のみを宣言し、メソッドは宣言しないオブジェクト型を作成する場合、型本体を指定する必要はありません。

  • SQLJオブジェクト型を作成する場合、型本体は指定できません。 型の実装はJavaクラスとして指定されます。


不完全型とは、フォワード型定義によって作成される型です。 このオブジェクト型には名前はありますが、属性およびメソッドがないため、不完全と呼ばれます。 他の型からの参照が可能なため、互いに参照する型の定義に使用できます。 ただし、不完全オブジェクト型を使用して表やオブジェクト列またはネストした表型の列を作成する場合は、型を完全に指定しておく必要があります。


注意:

CREATE TYPE文で作成するスタンドアロン・ストアド型は、PL/SQLブロックまたはパッケージで定義する型とは異なります。 後者の詳細は、「コレクション」を参照してください。

CREATE TYPE文を使用した場合、ネストした表型およびVARRY型は作成できますが、結合配列は作成できません。 PL/SQLブロックまたはパッケージでは、3つすべてのコレクション型を定義できます。


前提条件

自身のスキーマ内に型を作成するには、CREATE TYPEシステム権限が必要です。 別のユーザーのスキーマ内に型を作成するには、CREATE ANY TYPEシステム権限が必要です。 これらの権限は、明示的に取得することもロールを介して取得することもできます。

サブタイプを作成するには、UNDER ANY TYPEシステム権限またはスーパータイプに対するUNDERオブジェクト権限が必要です。

型の所有者には、型定義内で参照する他のすべての型にアクセスするためのEXECUTEオブジェクト権限、またはEXECUTE ANY TYPEシステム権限が必要です。 所有者は、これらの権限をロールを介して取得することはできません。

型の所有者が、型にアクセスする権限を他のユーザーに付与する場合、所有者には、参照型に対するGRANT OPTION付きのEXECUTEオブジェクト権限、またはADMIN OPTION付きのEXECUTE ANY TYPEシステム権限が必要です。 これらの権限がない場合、型の所有者は、型にアクセスする権限を他のユーザーに付与できません。

構文

create_type ::=

create_type
create_type.gifの説明

varray_type_def ::=nested_table_type_def ::=

object_type ::=

object_type
object_type.gifの説明

element_spec ::=

invoker_rights_clause ::=

invoker_rights_clause
invoker_rights_clause.gifの説明

sqlj_object_type ::=

sqlj_object_type
sqlj_object_type.gifの説明

sqlj_object_type_attr ::=

sqlj_object_type_attr
sqlj_object_type_attr.gifの説明

element_spec ::=

element_spec
element_spec.gifの説明

constructor_spec ::=map_order_function_spec ::=pragma_clause ::=

inheritance_clauses ::=

inheritance_clauses
inheritance_clauses.gifの説明

subprogram_spec ::=

subprogram_spec
subprogram_spec.gifの説明

procedure_spec ::=

procedure_spec
procedure_spec.gifの説明

call_spec ::=

function_spec ::=

function_spec
function_spec.gifの説明

return_clause ::=

constructor_spec ::=

constructor_spec
constructor_spec.gifの説明

call_spec ::=

map_order_function_spec ::=

map_order_function_spec
map_order_function_spec.gifの説明

function_spec ::=

return_clause ::=

return_clause
return_clause.gifの説明

call_spec ::=

sqlj_object_type_sig ::=

sqlj_object_type_sig
sqlj_object_type_sig.gifの説明

pragma_clause ::=

pragma_clause
pragma_clause.gifの説明

call_spec ::=

call_spec
call_spec.gifの説明

Java_declaration ::=

Java_declaration
java_declaration.gifの説明

C_declaration ::=

C_declaration
c_declaration.gifの説明

キーワードとパラメータの説明

OR REPLACE

OR REPLACEを指定すると、型がすでに存在する場合に再作成できます。 この句を指定すると、既存の型の定義を削除せずに変更できます。

再作成するオブジェクト型に対する権限を以前に付与されているユーザーは、権限を再度付与されなくてもそのオブジェクト型を使用および参照できます。

ファンクション索引が型に依存している場合、データベースによって索引にDISABLEDのマークが付けられます。

schema

型を含めるスキーマを指定します。 schemaを省略すると、データベースによって現行のスキーマに型が作成されます。

type_name

オブジェクト型、ネストした表型またはVARRAY型の名前を指定します。

型の作成時にコンパイル・エラーが発生した場合は、エラーが戻されます。 関連付けられているコンパイラ・エラー・メッセージは、SQL*PlusコマンドSHOW ERRORSを使用して確認できます。

作成した各ユーザー定義型に対して、データベースによって暗黙的にコンストラクタ・メソッドが定義されます。 コンストラクタは、型の値のインスタンスを構成するためにSQL文またはPL/SQLコードで使用されるシステム提供のプロシージャです。 コンストラクタ・メソッドの名前は、ユーザー定義型の名前と同じです。 また、constructor_spec構文を使用して、ユーザー定義コンストラクタを作成することもできます。

オブジェクト型のコンストラクタ・メソッドのパラメータは、オブジェクト型のデータ属性です。 また、そのオブジェクト型用の属性定義と同じ順序で定義されます。 ネストした表またはVARRAYコンストラクタのパラメータは、ネストした表またはVARRAYの要素です。

object_type

object_type句を使用すると、ユーザー定義オブジェクト型を作成できます。 データ構造を形成する変数は、属性と呼ばれます。 オブジェクトの動作を定義するメンバー・サブプログラムは、メソッドと呼ばれます。 キーワードAS OBJECTは、オブジェクト型の作成時に必要です。

OID 'object_identifier'

OID句は、複数のデータベースで同一オブジェクトについて型の等価を設定する場合に有効です。 (OIDは、Oracle Internet Directoryの略称です。) この句の詳細は、『Oracle Databaseオブジェクト・リレーショナル開発者ガイド』を参照してください。

invoker_rights_clause

メンバー・ファンクションのAUTHIDプロパティおよびオブジェクト型のプロシージャを指定します。 AUTHIDプロパティの詳細は、「実行者権限または定義者権限の使用(AUTHID句)」を参照してください。

実行者権限の制限 この句には、次の制限があります。


参照:

AUTHID句の詳細は、「実行者権限または定義者権限の使用(AUTHID句)」を参照してください。

AS OBJECT句

AS OBJECTを指定すると、トップレベルのオブジェクト型を作成できます。 このようなオブジェクト型は、ルート・オブジェクト型と呼ばれる場合があります。

UNDER句

UNDER supertypeを指定すると、既存の型のサブタイプを作成できます。 既存のスーパータイプは、オブジェクト型である必要があります。 この文で作成したサブタイプは、スーパータイプのプロパティを継承します。 プロパティの一部をオーバーライドするか、または新しいプロパティを追加して、スーパータイプと区別する必要があります。

sqlj_object_type

この句を指定すると、SQLJオブジェクト型を作成できます。 SQLJオブジェクト型では、JavaクラスをSQLのユーザー定義型にマップします。 SQLJオブジェクト型には、他のユーザー定義型の場合と同様に、表または列を定義できます。

1つのJavaクラスを複数のSQLJオブジェクト型にマップすることができます。 SQLJオブジェクト型のサブタイプまたはスーパータイプが存在する場合は、それもSQLJオブジェクト型である必要があります。 階層のすべての型はSQLJオブジェクト型である必要があります。


参照:

SQLJオブジェクト型の作成の詳細は、『Oracle Databaseオブジェクト・リレーショナル開発者ガイド』を参照してください。

java_ext_name Javaクラスの名前を指定します。 クラスが存在する場合は、パブリックにする必要があります。 スキーマを含むJavaの外部名は検証されます。

複数のSQLJオブジェクト型を同一のクラスにマップすることができます。 ただし、次のことに注意してください。

SQLData | CustomDatum | OraData 型のJavaインスタンスを作成するメカニズムを選択します。 SQLDataCustomDatumおよびOraDataは、使用するメカニズムを決定するインタフェースです。


参照:

これらのインタフェースの詳細は、『Oracle Database JDBC開発者ガイドおよびリファレンス』および「SQLJオブジェクト型の例」を参照してください。

element_spec

element_specを使用すると、オブジェクト型の各属性を指定できます。

attribute

attributeには、オブジェクト属性の名前を指定します。 属性は、オブジェクトの構造を形成する、名前および型指定子を持つデータ項目です。 各オブジェクト型には、1つ以上の属性を指定する必要があります。

サブタイプを作成する場合、連鎖するスーパータイプで宣言されている属性名またはメソッド名と同じ属性名を指定することはできません。

datatype

datatypeには、属性のデータベース組込みデータ型またはユーザー定義型を指定します。

属性のデータ型の制限 属性のデータ型には、次の制限があります。


参照:

有効なデータ型のリストについては、第3章「PL/SQLのデータ型」を参照してください。

sqlj_object_type_attr

この句は、sqlj_object_type句を指定してJavaクラスをSQLJオブジェクト型にマップした場合にのみ有効です。 SQLJオブジェクト型の属性に対応するJavaフィールドの外部名を指定します。 Javaのfield_nameがクラスに存在している必要があります。 Javaのfield_nameを、同じ型階層にある複数のSQLJオブジェクト型の属性にマップすることはできません。

この句は、SQLJオブジェクト型を作成する場合のオプションです。

subprogram_spec

subprogram_specを指定すると、プロシージャ・サブプログラムをオブジェクト型に関連付けることができます。

MEMBER句

属性として参照されるオブジェクト型に関連付けられたファンクション・サブプログラムまたはプロシージャ・サブプログラムを指定します。 通常、object_expression.method()などの自己参照的スタイルでMEMBERメソッドを起動します。 このクラスのメソッドには、メソッド本体でSELFとして参照される暗黙的な最初の引数があります。この引数は、メソッドが起動されるオブジェクトを表します。

メンバー・メソッドの制限 JavaクラスをSQLJオブジェクト型にマップする場合は、MEMBERメソッドを指定できません。

STATIC句

オブジェクト型に関連付けられたファンクション・サブプログラムまたはプロシージャ・サブプログラムを指定します。 MEMBERメソッドとは異なり、STATICメソッドに暗黙的なパラメータはありません。 本体でSELFを参照することはできません。 通常、type_name.method()として起動されます。

静的メソッドの制限 静的メソッドには、次の制限があります。

[NOT] FINAL、[NOT] INSTANTIABLE

これらの句を構文の最上位で指定すると、型の継承する属性を指定できます。

[NOT] FINAL句を使用すると、この型のサブタイプをさらに作成できるようにするかどうかを指定できます。

[NOT] INSTANTIABLE句を使用すると、この型のオブジェクト・インスタンスを作成できるかどうかを構成できます。

inheritance_clauses

element_specの一部としてinheritance_clausesを使用すると、スーパータイプとサブタイプの間の関係を指定できます。

OVERRIDING この句は、MEMBERメソッドでのみ有効です。 OVERRIDINGを指定すると、スーパータイプで定義されているMEMBERメソッドをこのメソッドでオーバーライドできます。 このキーワードは、このメソッドでスーパータイプのメソッドを再定義する場合には必須です。 NOT OVERRIDINGがデフォルトです。

OVERRIDINGの制限 OVERRIDING句は、STATICメソッドまたはSQLJオブジェクト型では無効です。

FINAL FINALを指定すると、このメソッドがこの型のサブタイプによってオーバーライドされないようにすることができます。 デフォルトは、NOT FINALです。

NOT INSTANTIABLE NOT INSTANTIABLEを指定すると、型でこのメソッドが実装されないようにすることができます。 デフォルトでは、すべてのメソッドはINSTANTIABLEです。

NOT INSTANTIABLEの制限 NOT INSTANTIABLEを指定すると、FINALまたはSTATICは指定できません。

procedure_specまたはfunction_spec

これらの句を使用すると、プロシージャまたはファンクションのパラメータおよびデータ型を指定できます。 このサブプログラムにプロシージャまたはファンクションの宣言が含まれていない場合は、対応するCREATE TYPE BODY文を発行する必要があります。

プロシージャの仕様部およびファンクションの仕様部の制限 サブタイプを作成する場合、プロシージャまたはファンクションには、継承されているかどうかに関係なく、連鎖するスーパータイプで宣言されている属性の名前と同じ名前は指定できません。

return_clause return_clauseの最初の形式はファンクションでのみ有効です。 示されている構文は、省略形です。


参照:


sqlj_object_type_sig return_clauseのこの形式を使用すると、SQLJオブジェクト型のファンクションまたはプロシージャを作成できます。

call_spec

JavaまたはCのメソッド名、パラメータ型および戻り型を、対応するSQLにマップするコール仕様を指定します。 型のすべてのメンバー・メソッドがこの句で定義された場合は、対応するCREATE TYPE BODY文を発行する必要はありません。

Java_declaration文字列は、メソッドのJava実装を識別します。


参照:

  • Java_declarationのパラメータおよびセマンティクスの詳細は、『Oracle Database Java開発者ガイド』を参照してください。

  • 外部プロシージャのコールの詳細は、『Oracle Databaseアドバンスト・アプリケーション開発者ガイド』を参照してください。


pragma_clause

pragma_clauseを使用すると、コンパイラ・ディレクティブを指定できます。 PRAGMA RESTRICT_REFERENCESコンパイラ・ディレクティブは、データベースの表またはパッケージ変数(あるいはその両方)に対するメンバー・ファンクションの読取り/書込みアクセスを拒否することによって、副作用の発生の防止に役立ちます。


注意:

アプリケーションの下位互換性を保つ必要がないかぎり、この句は使用しないことをお薦めします。 データベースで実行時に純正度チェックが行われるため、この句は非推奨となりました。

method プラグマが適用されているMEMBERファンクションまたはプロシージャの名前を指定します。

DEFAULT DEFAULTを指定すると、プラグマが明示的に指定されていない型のすべてのメソッドにプラグマを適用できます。

WNDS WNDSを指定すると、データベースへの書込み禁止状態制約(メソッドでデータベース表を変更できない制約)を適用できます。

WNPS WNPSを指定すると、パッケージへの書込み禁止状態制約(メソッドでパッケージ変数を変更できない制約)を適用できます。

RNDS RNDSを指定すると、データベースへの読取り禁止状態制約(メソッドでデータベース表を問合せできない制約)を適用できます。

RNPS RNPSを指定すると、パッケージへの読取り禁止状態制約(メソッドでパッケージ変数を参照できない制約)を適用できます。

TRUST TRUSTを指定すると、プラグマに指定されている制限が実際に適用されるのではなく、単に真であることが確認されるように指定できます。


参照:

このプラグマの詳細は、「RESTRICT_REFERENCESプラグマ」を参照してください。

constructor_spec

この句を使用すると、ユーザー定義オブジェクト型の初期化インスタンスを戻すファンクションであるユーザー定義コンストラクタを作成できます。 各コンストラクタのパラメータの数、順序またはデータ型が異なるかぎり、1つのオブジェクト型に対して複数のコンストラクタを宣言できます。


参照:

ユーザー定義コンストラクタの詳細および例は、『Oracle Databaseオブジェクト・リレーショナル開発者ガイド』および「コンストラクタの例」を参照してください。

map_order_function_spec

定義するMEMBERまたはSTATICメソッドの数に関係なく、型仕様部には、1つのMAPメソッドまたは1つのORDERメソッドを定義できます。 いずれかのメソッドを宣言すると、SQLでオブジェクト・インスタンスを比較できます。

サブタイプにはMAPおよびORDERメソッドのいずれも定義できません。 ただし、スーパータイプで最終以外のMAPメソッドを定義する場合は、サブタイプでMAPメソッドをオーバーライドできます。 サブタイプでは、ORDERメソッドはオーバーライドできません。

JavaクラスからSQL型へのマップ時に、MAPメソッドまたはORDERメソッドのいずれかを指定できます。 ただし、MAPメソッドおよびORDERメソッドは、JavaクラスのMEMBERファンクションにマップする必要があります。

MAPメソッドもORDERメソッドも指定されていない場合、比較できるのは等しいか等しくないかについてのみとなります。 したがって、オブジェクト・インスタンスに順序を付けることはできません。 同じ型定義のインスタンスは、それぞれの対応する属性の各ペアが等しい場合にのみ等しくなります。 2つのオブジェクト型が等しいかどうかを判断するために、比較メソッドを指定する必要はありません。

オブジェクト・インスタンスで大規模のソートまたはハッシュ結合操作を実行する場合は、MAPメソッドを使用します。 MAPメソッドを1回適用すると、オブジェクトがスカラー値にマップされ、ソート中およびマージ中にデータベースによってそのスカラーが使用されます。 MAPメソッドは、各オブジェクトを比較するメソッドを起動する必要があるORDERメソッドより効率的です。 ハッシュ結合ではMAPメソッドを使用する必要があります。 ハッシュ・メカニズムはオブジェクト値でハッシュするため、ORDERメソッドを使用することはできません。


参照:

オブジェクト値の比較の詳細は、『Oracle Databaseオブジェクト・リレーショナル開発者ガイド』を参照してください。

MAP MEMBER この句を使用すると、オブジェクトのすべてのインスタンスの順序における特定のインスタンスの相対的な位置を戻すMAPメンバー・ファンクションを指定できます。 MAPメソッドは暗黙的にコールされ、オブジェクト・インスタンスを事前定義済のスカラー型の値にマップすることによって、それらのオブジェクト・インスタンスに順序を設定します。 PL/SQLでは、順序付けを使用してブール式の評価と比較を行います。

MAPメソッドの引数がNULLの場合は、MAPメソッドによってNULLが戻され、メソッドは起動されません。

オブジェクトの仕様部には1つのMAPメソッドのみを含めることができ、このメソッドはファンクションである必要があります。 結果として生成される型は、事前定義済のSQLスカラー型である必要があります。また、MAPメソッドに指定できる引数は、暗黙的なSELF引数のみです。


注意:

ソート(ORDER BY句、GROUP BY句、DISTINCT句またはUNION句を使用)または結合を含む問合せでtype_nameが参照される場合に、それらの問合せをパラレル化するには、MAPメンバー・ファンクションを指定する必要があります。

サブタイプでは、新しいMAPメソッドを定義できません。 ただし、継承されたMAPメソッドはオーバーライドできます。

ORDER MEMBER この句を使用すると、オブジェクトのインスタンスを明示的な引数および暗黙的なSELF引数として取り、負の整数、0(ゼロ)または正の整数のいずれかを戻すORDERメンバー・ファンクションを指定できます。 負の整数、0(ゼロ)または正の整数は、暗黙的なSELF引数が明示的な引数より小さいか、等しいかまたは大きいことを示します。

ORDERメソッドのいずれかの引数がNULLの場合は、ORDERメソッドによってNULLが戻され、メソッドは起動されません。

同じオブジェクト型定義のインスタンスをORDER BY句で比較すると、ORDERメソッドmap_order_function_specが起動されます。

オブジェクトの仕様部には1つのORDERメソッドのみを含めることができ、このメソッドは戻り型NUMBERを持つファンクションである必要があります。

サブタイプでは、ORDERメソッドを定義およびオーバーライドすることはできません。

varray_type_def

varray_type_def句を使用すると、それぞれが同じデータ型を持つ要素の順序付け集合として型を作成できます。

VARRAY型の制限 プロシージャで使用するために、(PL/SQL、ビュー問合せなどで)XMLTypeまたはLOB型のVARRAY型を作成できます。 ただし、そのようなVARRAY型のデータベースへの格納はサポートされていないため、そのようなVARRAY型のオブジェクト表またはオブジェクト型列は作成できません。


参照:

VARRAY型の例

nested_table_type_def

nested_table_type_def句を使用すると、datatype型で名前付きのネストした表を作成できます。

オブジェクト型の例 次の例は、サンプルの注文入力スキーマ(oe)用にサンプルのcustomer_typ型を作成する方法を示しています。 テスト・データベースでこの例を複製できるように、表に仮定の名前が指定されています。

CREATE TYPE customer_typ_demo AS OBJECT
    ( customer_id        NUMBER(6)
    , cust_first_name    VARCHAR2(20)
    , cust_last_name     VARCHAR2(20)
    , cust_address       CUST_ADDRESS_TYP
    , phone_numbers      PHONE_LIST_TYP
    , nls_language       VARCHAR2(3)
    , nls_territory      VARCHAR2(30)
    , credit_limit       NUMBER(9,2)
    , cust_email         VARCHAR2(30)
    , cust_orders        ORDER_LIST_TYP
    ) ;
/

次の例では、CREATE TYPE BODY文で実装されるメンバー・ファンクションprodを持つdata_typ1オブジェクト型を作成します。

CREATE TYPE data_typ1 AS OBJECT
   ( year NUMBER,
     MEMBER FUNCTION prod(invent NUMBER) RETURN NUMBER
   );
/

CREATE TYPE BODY data_typ1 IS
      MEMBER FUNCTION prod (invent NUMBER) RETURN NUMBER IS
         BEGIN
             RETURN (year + invent);
         END;
      END;
/

サブタイプの例 次の文は、サンプル・スキーマoeにサブタイプcorporate_customer_typを作成する方法を示しています。 前述の例で作成したスーパータイプcustomer_typに基づき、account_mgr_id属性を追加しています。 テスト・データベースでこの例を複製できるように、表に仮定の名前が指定されています。

CREATE TYPE corporate_customer_typ_demo UNDER customer_typ
    ( account_mgr_id     NUMBER(6)
    );

SQLJオブジェクト型の例 次の例では、SQLJオブジェクト型およびサブタイプを作成します。 address_t型は、JavaクラスExamples.Addressにマップします。 サブタイプlong_address_tは、JavaクラスExamples.LongAddressにマップします。 この例では、これらの型に対するJavaインスタンスの作成に使用するメカニズムとしてSQLDataを指定します。 これらの型仕様部の各ファンクションには、対応する実装がJavaクラスにあります。


参照:

これらの型仕様部のファンクションをJavaで実装する場合の詳細は、『Oracle Databaseオブジェクト・リレーショナル開発者ガイド』を参照してください。

CREATE TYPE address_t AS OBJECT
  EXTERNAL NAME 'Examples.Address' LANGUAGE JAVA
  USING SQLData(
    street_attr varchar(250) EXTERNAL NAME 'street',
    city_attr varchar(50) EXTERNAL NAME 'city',
    state varchar(50) EXTERNAL NAME 'state',
    zip_code_attr number EXTERNAL NAME 'zipCode',
    STATIC FUNCTION recom_width RETURN NUMBER
      EXTERNAL VARIABLE NAME 'recommendedWidth',
    STATIC FUNCTION create_address RETURN address_t
      EXTERNAL NAME 'create() return Examples.Address',
    STATIC FUNCTION construct RETURN address_t
      EXTERNAL NAME 'create() return Examples.Address',
    STATIC FUNCTION create_address (street VARCHAR, city VARCHAR,
        state VARCHAR, zip NUMBER) RETURN address_t
      EXTERNAL NAME 'create (java.lang.String, java.lang.String, java.lang.String, int) return Examples.Address',
    STATIC FUNCTION construct (street VARCHAR, city VARCHAR,
        state VARCHAR, zip NUMBER) RETURN address_t
      EXTERNAL NAME
        'create (java.lang.String, java.lang.String, java.lang.String, int) return Examples.Address',
    MEMBER FUNCTION to_string RETURN VARCHAR
      EXTERNAL NAME 'tojava.lang.String() return java.lang.String',
    MEMBER FUNCTION strip RETURN SELF AS RESULT
      EXTERNAL NAME 'removeLeadingBlanks () return Examples.Address'
  ) NOT FINAL;
/

CREATE OR REPLACE TYPE long_address_t
UNDER address_t
EXTERNAL NAME 'Examples.LongAddress' LANGUAGE JAVA
USING SQLData(
    street2_attr VARCHAR(250) EXTERNAL NAME 'street2',
    country_attr VARCHAR (200) EXTERNAL NAME 'country',
    address_code_attr VARCHAR (50) EXTERNAL NAME 'addrCode',
    STATIC FUNCTION create_address RETURN long_address_t
      EXTERNAL NAME 'create() return Examples.LongAddress',
    STATIC FUNCTION  construct (street VARCHAR, city VARCHAR,
        state VARCHAR, country VARCHAR, addrs_cd VARCHAR)
      RETURN long_address_t
      EXTERNAL NAME
        'create(java.lang.String, java.lang.String,
        java.lang.String, java.lang.String, java.lang.String)
          return Examples.LongAddress',
    STATIC FUNCTION construct RETURN long_address_t
      EXTERNAL NAME 'Examples.LongAddress()
        return Examples.LongAddress',
    STATIC FUNCTION create_longaddress (
      street VARCHAR, city VARCHAR, state VARCHAR, country VARCHAR,
      addrs_cd VARCHAR) return long_address_t
      EXTERNAL NAME
        'Examples.LongAddress (java.lang.String, java.lang.String,
         java.lang.String, java.lang.String, java.lang.String)
           return Examples.LongAddress',
    MEMBER FUNCTION get_country RETURN VARCHAR
      EXTERNAL NAME 'country_with_code () return java.lang.String'
  );
/

型階層の例 次の文は、型階層を作成します。 employee_t型は、person_t型からnameおよびssn属性を継承し、department_idおよびsalary属性を追加しています。 part_time_emp_t型は、employee_tおよび(employee_tを介して)person_tからすべての属性を継承し、num_hrs属性を追加しています。 part_time_emp_t型はデフォルトで最終型であるため、さらにサブタイプは作成できません。

CREATE TYPE person_t AS OBJECT (name VARCHAR2(100), ssn NUMBER)
   NOT FINAL;
/

CREATE TYPE employee_t UNDER person_t
   (department_id NUMBER, salary NUMBER) NOT FINAL;
/

CREATE TYPE part_time_emp_t UNDER employee_t (num_hrs NUMBER);
/

この型階層を使用して、置換可能な表および置換可能な列を含む表を作成できます。

VARRAY型の例 次の文は、サンプル・スキーマoeに、5つの要素を含むVARRAY型phone_list_typを作成する方法を示しています。 テスト・データベースでこの例を複製できるように、表に仮定の名前が指定されています。

CREATE TYPE phone_list_typ_demo AS VARRAY(5) OF VARCHAR2(25);

ネストした表型の例 サンプル・スキーマpmの次の例では、オブジェクト型textdoc_typの表型textdoc_tabを作成します。

CREATE TYPE textdoc_typ AS OBJECT
    ( document_typ      VARCHAR2(32)
    , formatted_doc     BLOB
    ) ;

CREATE TYPE textdoc_tab AS TABLE OF textdoc_typ;

VARRAYを含むネストした表型 次のマルチレベル・コレクションの例は、サンプル表oe.customersの一例です。 この例では、cust_addressオブジェクト列は、VARRAY列phone_list_typが埋め込まれたネストした表の列になります。 このphone_list_typ型は、「VARRAY型の例」で作成された型です。

CREATE TYPE cust_address_typ2 AS OBJECT
       ( street_address     VARCHAR2(40)
       , postal_code        VARCHAR2(10)
       , city               VARCHAR2(30)
       , state_province     VARCHAR2(10)
       , country_id         CHAR(2)
       , phone              phone_list_typ_demo
       );

CREATE TYPE cust_nt_address_typ
   AS TABLE OF cust_address_typ2;

コンストラクタの例 次の例では、システム定義のコンストラクタを起動して、demo_typオブジェクトを構成し、構成したオブジェクトをdemo_tab表に挿入します。

CREATE TYPE demo_typ1 AS OBJECT (a1 NUMBER, a2 NUMBER);

CREATE TABLE demo_tab1 (b1 NUMBER, b2 demo_typ1);

INSERT INTO demo_tab1 VALUES (1, demo_typ1(2,3));

参照:

コンストラクタの詳細は、『Oracle Databaseオブジェクト・リレーショナル開発者ガイド』を参照してください。

メンバー・メソッドの作成: 例 次の例では、メソッド・コンストラクタcol.get_squareを起動します。 まず、型を作成します。

CREATE TYPE demo_typ2 AS OBJECT (a1 NUMBER,
   MEMBER FUNCTION get_square RETURN NUMBER);

次に、オブジェクト型列を持つ表を作成し、その表にデータを挿入します。

CREATE TABLE demo_tab2(col demo_typ2);

INSERT INTO demo_tab2 VALUES (demo_typ2(2));

メンバー・ファンクションを定義する型本体を作成し、メンバー・メソッドを起動します。

CREATE TYPE BODY demo_typ2 IS
   MEMBER FUNCTION get_square
   RETURN NUMBER
   IS x NUMBER;
   BEGIN
      SELECT c.col.a1*c.col.a1 INTO x
      FROM demo_tab2 c;
      RETURN (x);
   END;
END;
/

SELECT t.col.get_square() FROM demo_tab2 t;

T.COL.GET_SQUARE()
------------------
                 4

ファンクションとは異なり、メソッドを起動する場合は、メソッドが他に引数を取らない場合でもカッコが必要です。

静的メソッドの作成: 例 次の文は、employee_t型の定義を変更し、変更した定義をconstruct_empファンクションと関連付けます。 この例では、最初にオブジェクト型department_tを作成し、次にdepartment_t型の属性を含むオブジェクト型employee_tを作成します。

CREATE OR REPLACE TYPE department_t AS OBJECT (
   deptno number(10),
   dname CHAR(30));

CREATE OR REPLACE TYPE employee_t AS OBJECT(
   empid RAW(16),
   ename CHAR(31),
   dept REF department_t,
      STATIC function construct_emp
      (name VARCHAR2, dept REF department_t)
      RETURN employee_t
);

この文には、次の型本体の文が必要です。

CREATE OR REPLACE TYPE BODY employee_t IS
   STATIC FUNCTION construct_emp
   (name varchar2, dept REF department_t)
   RETURN employee_t IS
      BEGIN
         return employee_t(SYS_GUID(),name,dept);
      END;
END;

次に、オブジェクト表を作成し、表に挿入します。

CREATE TABLE emptab OF employee_t;
INSERT INTO emptab
   VALUES (employee_t.construct_emp('John Smith', NULL));

関連トピック


参照:

オブジェクト、不完全型、VARRAYおよびネストした表の詳細は、『Oracle Databaseオブジェクト・リレーショナル開発者ガイド』を参照してください。