CREATE
TYPE
文は、次のいずれかの仕様を作成するか、または置き換えます。
スタンドアロン型の可変配列(VARRAY)型
スタンドアロン型のネストした表型
不完全なオブジェクト型
不完全型とは、フォワード型定義によって作成される型です。このオブジェクト型には名前はありますが、属性およびメソッドがないために不完全と呼ばれます。他の型からの参照が可能なため、互いに参照する型を定義できます。ただし、不完全オブジェクト型を使用して表やオブジェクト列またはネストした表型の列を作成する場合は、型を完全に指定しておく必要があります。
CREATE
TYPE
文は、型の名前、属性、メソッドおよびその他のプロパティを指定します。CREATE
TYPE
BODY
文には、型を実装するメソッドのコードが含まれています。
注意:
|
ここでのトピック
構文
create_type ::=
参照:
object_type_def ::=
詳細は、「element_spec ::=」を参照してください。
invoker_rights_clause ::=
sqlj_object_type ::=
sqlj_object_type_attr ::=
element_spec ::=
参照:
inheritance_clauses ::=
subprogram_spec ::=
procedure_spec ::=
「call_spec ::=」を参照してください。
function_spec ::=
return_clause ::=
「call_spec ::=」を参照してください。
constructor_spec ::=
「call_spec ::=」を参照してください。
map_order_function_spec ::=
「function_spec ::=」を参照してください。
sqlj_object_type_sig ::=
前提条件
自分のスキーマ内に型を作成するには、CREATE
TYPE
システム権限が必要です。別のユーザーのスキーマ内に型を作成するには、CREATE
ANY
TYPE
システム権限が必要です。これらの権限は、明示的に取得することもロールを介して取得することもできます。
サブタイプを作成するには、UNDER
ANY
TYPE
システム権限またはスーパータイプに対するUNDER
オブジェクト権限が必要です。
型の所有者には、型定義内で参照する他のすべての型にアクセスするためのEXECUTE
オブジェクト権限、またはEXECUTE
ANY
TYPE
システム権限が必要です。所有者は、これらの権限をロールを介して取得することはできません。
型の所有者が、型にアクセスする権限を他のユーザーに付与する場合、所有者には、参照型に対するGRANT
OPTION
付きのEXECUTE
オブジェクト権限、またはADMIN
OPTION
付きのEXECUTE
ANY
TYPE
システム権限が必要です。これらの権限がない場合、型の所有者は、型にアクセスする権限を他のユーザーに付与できません。
セマンティクス
OR REPLACE
型が存在する場合は、型を再作成し、再コンパイルします。
再定義する前の型に対する権限を付与されていたユーザーは、権限を再付与される必要なく、型にアクセスできます。
ファンクション索引が型に依存している場合、データベースによって索引にDISABLED
のマークが付けられます。
schema
型が含まれているスキーマの名前。デフォルト: 自分のスキーマ。
type_name
ADT、ネストした表型またはVARRAY
型の名前。
型の作成時にコンパイル・エラーが発生した場合は、エラーが戻されます。関連付けられているコンパイラ・エラー・メッセージは、SQL*PlusコマンドSHOW
ERRORS
を使用して確認できます。
作成した各ユーザー定義型に対して、データベースによって暗黙的にコンストラクタ・メソッドが定義されます。コンストラクタは、型の値のインスタンスを構成するためにSQL文またはPL/SQLコードで使用されるシステム提供のプロシージャです。コンストラクタ・メソッドの名前は、ユーザー定義型の名前です。また、constructor_spec
構文を使用して、ユーザー定義コンストラクタを作成することもできます。
ADTのコンストラクタ・メソッドのパラメータは、ADTのデータ属性です。また、そのADT用の属性定義と同じ順序で定義されます。ネストした表またはVARRAYコンストラクタのパラメータは、ネストした表またはVARRAYの要素です。
FORCE
type_name
が存在し、型依存性はあり、表依存性はない場合は、FORCE
によって文の型が置き換えられます。(type_name
に表依存性がある場合は、FORCE
の有無にかかわらず文は失敗します。)
注意: 型t1 に型t2 との依存性があり、型t2 に表依存性がある場合は、型t1 にも表依存性があります。 |
関連項目: 『Oracle Databaseオブジェクト・リレーショナル開発者ガイド』 |
object_type_def
ADTを作成します。データ構造を形成する変数は、属性と呼ばれます。ADTの動作を定義するメンバー・サブプログラムは、メソッドと呼ばれます。ADTの作成時には、キーワードAS
OBJECT
が必要です。
OID 'object_identifier
複数のデータベースで同一オブジェクトの型の等価を設定します。この句の詳細は、『Oracle Databaseオブジェクト・リレーショナル開発者ガイド』を参照してください。
invoker_rights_clause
ADTのメンバー・ファンクションおよびプロシージャのAUTHID
プロパティを指定します。AUTHID
プロパティの詳細は、「実行者権限および定義者権限(AUTHIDプロパティ)」を参照してください。
invoker_rights_clauseの制限 この句には、次の制限があります。
この句は、ADTにのみ指定でき、ネストした表またはVARRAY
型には指定できません。
サブタイプを作成する場合は、意味を明確にするためにこの句を指定できます。ただし、サブタイプはスーパータイプのAUTHID
プロパティを継承するため、スーパータイプに指定した値と異なる値は指定できません。
スーパータイプがAUTHID
DEFINER
で作成された場合は、スーパータイプと同じスキーマでサブタイプを作成する必要があります。
AS OBJECT
スキーマ・レベルのADTを作成します。このようなADTは、ルートADTと呼ばれる場合があります。
UNDER supertype
既存の型のサブタイプを作成します。既存のスーパータイプは、ADTである必要があります。この文で作成したサブタイプは、スーパータイプのプロパティを継承します。サブタイプではプロパティの一部をオーバーライドするか、またはプロパティを追加して、スーパータイプと区別する必要があります。
sqlj_object_type
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
ADTの各属性を指定します。
attribute
ADT属性の名前。ADT属性は、ADTの構造を形成する、名前および型指定子を持つデータ項目です。各ADTには、1つ以上の属性を指定する必要があります。名前はそのADT内で一意である必要がありますが、他のADT内では使用できます。
サブタイプを作成する場合、連鎖するスーパータイプで宣言されている属性名またはメソッド名と同じ属性名を指定することはできません。
datatype
ADT属性のデータ型。このデータ型は、データベースに格納されている必要があります(つまり、事前定義のデータ型またはユーザー定義のスタンドアロン・コレクション型のいずれかになります)。事前定義のデータ型の詳細は、第3章「PL/SQLのデータ型」を参照してください。ユーザー定義のスタンドアロン・コレクション型の詳細は、「コレクション型」を参照してください。
datatypeの制限
属性にNOT
NULL
制約を課すことはできません。
ROWID
型、LONG
型またはLONG
RAW
型の属性は指定できません。
UROWID
というデータ型は、ADTには指定できません。
REF
型のオブジェクトを指定する場合、ターゲット・オブジェクトにはオブジェクト識別子が必要です。
ネストした表または表のVARRAY列として使用するためのコレクション型を作成する場合、ANYTYPE
型、ANYDATA
型またはANYDATASET
型の属性を指定することはできません。
sqlj_object_type_attr
この句は、sqlj_object_type
句を指定してJavaクラスをSQLJオブジェクト型にマップした場合にのみ有効です。SQLJオブジェクト型の属性に対応するJavaフィールドの外部名を指定します。Javaのfield_name
がクラスに存在している必要があります。Javaのfield_name
を、同じ型階層にある複数のSQLJオブジェクト型の属性にマップすることはできません。
この句は、SQLJオブジェクト型を作成する場合のオプションです。
subprogram_spec
プロシージャ・サブプログラムをADTに関連付けます。
MEMBER
属性として参照されるADTに関連付けられたファンクション・サブプログラムまたはプロシージャ・サブプログラム。通常、object_expression.method
()
などの自己参照的スタイルでMEMBER
メソッドを起動します。このクラスのメソッドには、メソッド本体でSELF
として参照される暗黙的な最初の引数があり、この引数は、メソッドが起動されるオブジェクトを表します。
MEMBERの制限 JavaクラスをSQLJオブジェクト型にマップする場合、MEMBER
メソッドは指定できません。
STATIC
ADTに関連付けられたファンクション・サブプログラムまたはプロシージャ・サブプログラム。MEMBER
メソッドとは異なり、STATIC
メソッドに暗黙的なパラメータはありません。本体でSELF
を参照することはできません。通常、type_name.method
()
として起動されます。
STATICの制限
JavaクラスのMEMBER
メソッドをSQLJオブジェクト型のSTATIC
メソッドにマップすることはできません。
MEMBER
メソッドの場合も、STATIC
メソッドの場合も、プロシージャの仕様部またはファンクションの仕様部に対応するメソッド本体を型本体に指定する必要があります。
[NOT] FINAL、[NOT] INSTANTIABLE
これらの句を構文のスキーマ・レベルで指定すると、型の継承する属性を指定できます。
[NOT
] FINAL
句を使用すると、この型のサブタイプをさらに作成できるようにするかどうかを指定できます。
(デフォルト)この型に対してサブタイプをさらに作成できないようにする場合は、FINAL
を指定します。
この型に対してサブタイプをさらに作成できるようにする場合は、NOT
FINAL
を指定します。
[NOT
] INSTANTIABLE
句を使用すると、この型のオブジェクト・インスタンスを作成できるかどうかを構成できます。
(デフォルト)この型のオブジェクト・インスタンスを構成できる場合は、INSTANTIABLE
を指定します。
このADTに対してデフォルトまたはユーザー定義のコンストラクタが存在しない場合は、NOT
INSTANTIABLE
を指定します。インスタンス化ができないメソッドを持つ型、および継承された属性またはこの句で指定された属性を持たない型には、これらのキーワードを指定する必要があります。
inheritance_clauses
スーパータイプとサブタイプの間の関係を指定します。
OVERRIDING
スーパータイプで定義されているMEMBER
メソッドがこのメソッドによってオーバーライドされるように指定します。このキーワードは、このメソッドでスーパータイプのメソッドを再定義する場合には必須です。デフォルト: NOT
OVERRIDING
。
OVERRIDINGの制限 OVERRIDING
句は、STATIC
メソッドまたはSQLJオブジェクト型では無効です。
FINAL
このメソッドがこの型のサブタイプによってオーバーライドされないように指定します。デフォルト: NOT
FINAL
。
NOT INSTANTIABLE
このメソッドが型で実装されないように指定します。デフォルト: すべてのメソッドがINSTANTIABLE
です。
NOT INSTANTIABLEの制限 NOT
INSTANTIABLE
を指定すると、FINAL
またはSTATIC
は指定できません。
procedure_specまたはfunction_spec
プロシージャまたはファンクションのパラメータおよびデータ型を指定します。このサブプログラムにプロシージャまたはファンクションの宣言が含まれていない場合は、対応するCREATE
TYPE
BODY
文を発行する必要があります。
procedure_specまたはfunction_specの制限 サブタイプを作成する場合、プロシージャまたはファンクションには、継承されているかどうかに関係なく、連鎖するスーパータイプで宣言されている属性の名前と同じ名前は指定できません。
return_clause
return_clause
の最初の形式はファンクションでのみ有効です。示されている構文は、省略形です。
関連項目:
|
sqlj_object_type_sig
SQLJオブジェクト型のファンクションまたはプロシージャを作成する場合は、この形式のreturn_clause
を使用します。
JavaクラスをSQLJオブジェクト型にマップし、EXTERNAL
NAME
を指定する場合は、Javaメソッドが戻す値はSQLが戻す値と互換性があり、Javaメソッドがパブリックである必要があります。また、メソッド・シグネチャ(メソッド名とパラメータ型)は、型階層内で一意である必要があります。
EXTERNAL
VARIABLE
NAME
を指定する場合、Javaの静的フィールドの型は戻り型と互換性がある必要があります。
call_spec、EXTERNAL
詳細は、「call_spec」および「EXTERNAL」を参照してください。
restrict_references_pragma
非推奨の句です。「RESTRICT_REFERENCESプラグマ」を参照してください。
constructor_spec
ADTの初期化インスタンスを戻すファンクションであるユーザー定義コンストラクタを作成します。各コンストラクタのパラメータの数、順序またはデータ型が異なる場合は、1つのADTに対して複数のコンストラクタを宣言できます。
ユーザー定義コンストラクタ・ファンクションは常にFINAL
およびINSTANTIABLE
であるため、これらのキーワードはオプションです。
ユーザー定義コンストラクタのパラメータの引渡しモードは常にSELF
IN
OUT
です。そのため、意味を明確にするために指定する場合を除き、この句を指定する必要はありません。
RETURN
SELF
AS
RESULT
は、コンストラクタによって戻される値の実行時型が、SELF
引数の実行時型になるように指定します。
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つのADTが等しいかどうかを判断するために、比較メソッドを指定する必要はありません。
オブジェクト・インスタンスで大規模のソートまたはハッシュ結合操作を実行する場合は、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が戻され、メソッドは起動されません。
同じADT定義のインスタンスをORDER
BY
句で比較すると、ORDER
メソッドmap_order_function_spec
が起動されます。
オブジェクトの仕様部には1つのORDER
メソッドのみを含めることができ、このメソッドは戻り型NUMBER
を持つファンクションである必要があります。
サブタイプでは、ORDER
メソッドを定義およびオーバーライドすることはできません。
varray_type_def
それぞれが同じデータ型を持つ要素の順序付け集合として型を作成します。
varray_type_defの制限 プロシージャで使用するために、(PL/SQL、ビュー問合せなどで)XMLType
またはLOB型のVARRAY
型を作成できます。ただし、そのようなVARRAY型のデータベースへの格納はサポートされていないため、そのようなVARRAY
型のオブジェクト表または列は作成できません。
nested_table_type_def
datatype
型で名前付きのネストした表を作成します。
例
ADTの例 次の例は、サンプルの注文入力スキーマ(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
ADTを作成します。
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);
次に、ADT列を持つ表を作成し、その表にデータを挿入します。
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
ファンクションと関連付けます。この例では、最初にADT department_t
を作成し、次にdepartment_t
型の属性を含むADT 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));