CREATE
TYPE
文は、オブジェクト型、SQLJオブジェクト型、名前付きの可変配列(VARRAY)、ネストした表型または不完全オブジェクト型の仕様部を作成するか、または置き換えます。 CREATE
TYPE
文およびCREATE
TYPE
BODY
文を使用して、オブジェクト型を作成します。 CREATE
TYPE
文は、オブジェクト型の名前、オブジェクトの属性、メソッドおよびその他のプロパティを指定します。 CREATE
TYPE
BODY
文には、型を実装するメソッドのコードが含まれています。
注意:
|
不完全型とは、フォワード型定義によって作成される型です。 このオブジェクト型には名前はありますが、属性およびメソッドがないため、不完全と呼ばれます。 他の型からの参照が可能なため、互いに参照する型の定義に使用できます。 ただし、不完全オブジェクト型を使用して表やオブジェクト列またはネストした表型の列を作成する場合は、型を完全に指定しておく必要があります。
注意: CREATE TYPE 文で作成するスタンドアロン・ストアド型は、PL/SQLブロックまたはパッケージで定義する型とは異なります。 後者の詳細は、「コレクション」を参照してください。
|
前提条件
自身のスキーマ内に型を作成するには、CREATE
TYPE
システム権限が必要です。 別のユーザーのスキーマ内に型を作成するには、CREATE
ANY
TYPE
システム権限が必要です。 これらの権限は、明示的に取得することもロールを介して取得することもできます。
サブタイプを作成するには、UNDER
ANY
TYPE
システム権限またはスーパータイプに対するUNDER
オブジェクト権限が必要です。
型の所有者には、型定義内で参照する他のすべての型にアクセスするためのEXECUTE
オブジェクト権限、またはEXECUTE
ANY
TYPE
システム権限が必要です。 所有者は、これらの権限をロールを介して取得することはできません。
型の所有者が、型にアクセスする権限を他のユーザーに付与する場合、所有者には、参照型に対するGRANT
OPTION
付きのEXECUTE
オブジェクト権限、またはADMIN
OPTION
付きのEXECUTE
ANY
TYPE
システム権限が必要です。 これらの権限がない場合、型の所有者は、型にアクセスする権限を他のユーザーに付与できません。
構文
create_type ::=
(varray_type_def ::=、nested_table_type_def ::=)
object_type ::=
sqlj_object_type ::=
element_spec ::=
(constructor_spec ::=、map_order_function_spec ::=、pragma_clause ::=)
inheritance_clauses ::=
subprogram_spec ::=
procedure_spec ::=
function_spec ::=
constructor_spec ::=
map_order_function_spec ::=
return_clause ::=
pragma_clause ::=
call_spec ::=
Java_declaration ::=
C_declaration ::=
キーワードとパラメータの説明
OR
REPLACE
を指定すると、型がすでに存在する場合に再作成できます。 この句を指定すると、既存の型の定義を削除せずに変更できます。
再作成するオブジェクト型に対する権限を以前に付与されているユーザーは、権限を再度付与されなくてもそのオブジェクト型を使用および参照できます。
ファンクション索引が型に依存している場合、データベースによって索引にDISABLED
のマークが付けられます。
schema
型を含めるスキーマを指定します。 schema
を省略すると、データベースによって現行のスキーマに型が作成されます。
type_name
オブジェクト型、ネストした表型またはVARRAY型の名前を指定します。
型の作成時にコンパイル・エラーが発生した場合は、エラーが戻されます。 関連付けられているコンパイラ・エラー・メッセージは、SQL*PlusコマンドSHOW
ERRORS
を使用して確認できます。
作成した各ユーザー定義型に対して、データベースによって暗黙的にコンストラクタ・メソッドが定義されます。 コンストラクタは、型の値のインスタンスを構成するためにSQL文またはPL/SQLコードで使用されるシステム提供のプロシージャです。 コンストラクタ・メソッドの名前は、ユーザー定義型の名前と同じです。 また、constructor_spec
構文を使用して、ユーザー定義コンストラクタを作成することもできます。
オブジェクト型のコンストラクタ・メソッドのパラメータは、オブジェクト型のデータ属性です。 また、そのオブジェクト型用の属性定義と同じ順序で定義されます。 ネストした表またはVARRAYコンストラクタのパラメータは、ネストした表またはVARRAYの要素です。
object_type
句を使用すると、ユーザー定義オブジェクト型を作成できます。 データ構造を形成する変数は、属性と呼ばれます。 オブジェクトの動作を定義するメンバー・サブプログラムは、メソッドと呼ばれます。 キーワードAS
OBJECT
は、オブジェクト型の作成時に必要です。
OID
句は、複数のデータベースで同一オブジェクトについて型の等価を設定する場合に有効です。 (OIDは、Oracle Internet Directoryの略称です。) この句の詳細は、『Oracle Databaseオブジェクト・リレーショナル開発者ガイド』を参照してください。
メンバー・ファンクションのAUTHID
プロパティおよびオブジェクト型のプロシージャを指定します。 AUTHID
プロパティの詳細は、「実行者権限または定義者権限の使用(AUTHID句)」を参照してください。
実行者権限の制限 この句には、次の制限があります。
この句は、オブジェクト型にのみ指定でき、ネストした表またはVARRAY型には指定できません。
サブタイプを作成する場合は、意味を明確にするためにこの句を指定できます。 ただし、サブタイプはスーパータイプの権限モデルを継承するため、スーパータイプに指定した値と異なる値を指定できません。
スーパータイプが定義者権限で作成された場合、スーパータイプと同じスキーマでサブタイプを作成する必要があります。
AS
OBJECT
を指定すると、トップレベルのオブジェクト型を作成できます。 このようなオブジェクト型は、ルート・オブジェクト型と呼ばれる場合があります。
UNDER
supertype
を指定すると、既存の型のサブタイプを作成できます。 既存のスーパータイプは、オブジェクト型である必要があります。 この文で作成したサブタイプは、スーパータイプのプロパティを継承します。 プロパティの一部をオーバーライドするか、または新しいプロパティを追加して、スーパータイプと区別する必要があります。
この句を指定すると、SQLJオブジェクト型を作成できます。 SQLJオブジェクト型では、JavaクラスをSQLのユーザー定義型にマップします。 SQLJオブジェクト型には、他のユーザー定義型の場合と同様に、表または列を定義できます。
1つのJavaクラスを複数のSQLJオブジェクト型にマップすることができます。 SQLJオブジェクト型のサブタイプまたはスーパータイプが存在する場合は、それもSQLJオブジェクト型である必要があります。 階層のすべての型はSQLJオブジェクト型である必要があります。
参照: SQLJオブジェクト型の作成の詳細は、『Oracle Databaseオブジェクト・リレーショナル開発者ガイド』を参照してください。 |
java_ext_name Javaクラスの名前を指定します。 クラスが存在する場合は、パブリックにする必要があります。 スキーマを含むJavaの外部名は検証されます。
複数のSQLJオブジェクト型を同一のクラスにマップすることができます。 ただし、次のことに注意してください。
スーパータイプをマップするクラス直属のサブクラスに、サブタイプをマップする必要があります。
スーパータイプが共通の2つのサブタイプを同一のクラスにマップすることはできません。
SQLData | CustomDatum | OraData 型のJavaインスタンスを作成するメカニズムを選択します。 SQLData
、CustomDatum
およびOraData
は、使用するメカニズムを決定するインタフェースです。
element_spec
element_spec
を使用すると、オブジェクト型の各属性を指定できます。
attribute
attribute
には、オブジェクト属性の名前を指定します。 属性は、オブジェクトの構造を形成する、名前および型指定子を持つデータ項目です。 各オブジェクト型には、1つ以上の属性を指定する必要があります。
サブタイプを作成する場合、連鎖するスーパータイプで宣言されている属性名またはメソッド名と同じ属性名を指定することはできません。
datatype
datatype
には、属性のデータベース組込みデータ型またはユーザー定義型を指定します。
属性のデータ型の制限 属性のデータ型には、次の制限があります。
ROWID
型、LONG
型またはLONG
RAW
型の属性は指定できません。
UROWID
のデータ型は、ユーザー定義オブジェクト型には指定できません。
REF
型のオブジェクトを指定する場合、ターゲット・オブジェクトにはオブジェクト識別子が必要です。
ネストした表または表のVARRAY列として使用するためのコレクション型を作成する場合、ANYTYPE
型、ANYDATA
型またはANYDATASET
型の属性を指定することはできません。
この句は、sqlj_object_type
句を指定してJavaクラスをSQLJオブジェクト型にマップした場合にのみ有効です。 SQLJオブジェクト型の属性に対応するJavaフィールドの外部名を指定します。 Javaのfield_name
がクラスに存在している必要があります。 Javaのfield_name
を、同じ型階層にある複数のSQLJオブジェクト型の属性にマップすることはできません。
この句は、SQLJオブジェクト型を作成する場合のオプションです。
subprogram_spec
subprogram_spec
を指定すると、プロシージャ・サブプログラムをオブジェクト型に関連付けることができます。
属性として参照されるオブジェクト型に関連付けられたファンクション・サブプログラムまたはプロシージャ・サブプログラムを指定します。 通常、object_expression.method
()
などの自己参照的スタイルでMEMBER
メソッドを起動します。 このクラスのメソッドには、メソッド本体でSELF
として参照される暗黙的な最初の引数があります。この引数は、メソッドが起動されるオブジェクトを表します。
メンバー・メソッドの制限 JavaクラスをSQLJオブジェクト型にマップする場合は、MEMBER
メソッドを指定できません。
オブジェクト型に関連付けられたファンクション・サブプログラムまたはプロシージャ・サブプログラムを指定します。 MEMBER
メソッドとは異なり、STATIC
メソッドに暗黙的なパラメータはありません。 本体でSELF
を参照することはできません。 通常、type_name.method
()
として起動されます。
静的メソッドの制限 静的メソッドには、次の制限があります。
JavaクラスのMEMBER
メソッドをSQLJオブジェクト型のSTATIC
メソッドにマップすることはできません。
MEMBER
メソッドの場合も、STATIC
メソッドの場合も、プロシージャの仕様部またはファンクションの仕様部に対応するメソッド本体をオブジェクト型本体に指定する必要があります。
[NOT] FINAL、[NOT] INSTANTIABLE
これらの句を構文の最上位で指定すると、型の継承する属性を指定できます。
[NOT
] FINAL
句を使用すると、この型のサブタイプをさらに作成できるようにするかどうかを指定できます。
この型に対してサブタイプをさらに作成できないようにする場合は、FINAL
を指定します。 これはデフォルトです。
この型に対してサブタイプをさらに作成できるする場合は、NOT
FINAL
を指定します。
[NOT
] INSTANTIABLE
句を使用すると、この型のオブジェクト・インスタンスを作成できるかどうかを構成できます。
この型のオブジェクト・インスタンスを構成できる場合は、INSTANTIABLE
を指定します。 これはデフォルトです。
このオブジェクト型に対してデフォルトまたはユーザー定義のコンストラクタが存在しない場合は、NOT
INSTANTIABLE
を指定します。 インスタンス化ができないメソッドを持つ型、および継承された属性またはこの句で指定された属性を持たない型には、これらのキーワードを指定する必要があります。
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オブジェクト型のファンクションまたはプロシージャを作成できます。
JavaクラスをSQLJオブジェクト型にマップし、EXTERNAL
NAME
を指定する場合は、Javaメソッドが戻す値はSQLが戻す値と互換性があり、Javaメソッドがパブリックである必要があります。 また、メソッド・シグネチャ(メソッド名とパラメータ型)は、型階層内で一意である必要があります。
EXTERNAL
VARIABLE
NAME
を指定する場合、Javaの静的フィールドの型は戻り型と互換性がある必要があります。
JavaまたはCのメソッド名、パラメータ型および戻り型を、対応するSQLにマップするコール仕様を指定します。 型のすべてのメンバー・メソッドがこの句で定義された場合は、対応するCREATE
TYPE
BODY
文を発行する必要はありません。
Java_declaration
文字列は、メソッドのJava実装を識別します。
参照:
|
pragma_clause
を使用すると、コンパイラ・ディレクティブを指定できます。 PRAGMA
RESTRICT_REFERENCES
コンパイラ・ディレクティブは、データベースの表またはパッケージ変数(あるいはその両方)に対するメンバー・ファンクションの読取り/書込みアクセスを拒否することによって、副作用の発生の防止に役立ちます。
注意: アプリケーションの下位互換性を保つ必要がないかぎり、この句は使用しないことをお薦めします。 データベースで実行時に純正度チェックが行われるため、この句は非推奨となりました。 |
method プラグマが適用されているMEMBER
ファンクションまたはプロシージャの名前を指定します。
DEFAULT DEFAULT
を指定すると、プラグマが明示的に指定されていない型のすべてのメソッドにプラグマを適用できます。
WNDS WNDS
を指定すると、データベースへの書込み禁止状態制約(メソッドでデータベース表を変更できない制約)を適用できます。
WNPS WNPS
を指定すると、パッケージへの書込み禁止状態制約(メソッドでパッケージ変数を変更できない制約)を適用できます。
RNDS RNDS
を指定すると、データベースへの読取り禁止状態制約(メソッドでデータベース表を問合せできない制約)を適用できます。
RNPS RNPS
を指定すると、パッケージへの読取り禁止状態制約(メソッドでパッケージ変数を参照できない制約)を適用できます。
TRUST TRUST
を指定すると、プラグマに指定されている制限が実際に適用されるのではなく、単に真であることが確認されるように指定できます。
この句を使用すると、ユーザー定義オブジェクト型の初期化インスタンスを戻すファンクションであるユーザー定義コンストラクタを作成できます。 各コンストラクタのパラメータの数、順序またはデータ型が異なるかぎり、1つのオブジェクト型に対して複数のコンストラクタを宣言できます。
ユーザー定義コンストラクタ・ファンクションは常にFINAL
およびINSTANTIABLE
であるため、これらのキーワードはオプションです。
ユーザー定義コンストラクタのパラメータの引渡しモードは常にSELF
IN
OUT
です。 そのため、意味を明確にするために指定する場合を除き、この句を指定する必要はありません。
RETURN
SELF
AS
RESULT
は、コンストラクタによって戻される値の実行時型が、SELF
引数の実行時型と同じになるように指定します。
定義する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型の制限 プロシージャで使用するために、(PL/SQL、ビュー問合せなどで)XMLType
またはLOB型のVARRAY
型を作成できます。 ただし、そのようなVARRAY型のデータベースへの格納はサポートされていないため、そのようなVARRAY型のオブジェクト表またはオブジェクト型列は作成できません。
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オブジェクト・リレーショナル開発者ガイド』を参照してください。 |