日本語PDF

13.24 要素の仕様

要素の仕様でADTの各属性を指定します。

要素の仕様は、次のSQL文に指定できます。

ここでのトピック

構文

inheritance_clauses ::=

function_spec ::=

セマンティクス

element_spec

inheritance_clauses

スーパータイプとサブタイプの間の関係を指定します。

[NOT] OVERRIDING

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

[NOT] FINAL

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

[NOT] INSTANTIABLE

このメソッドが型で実装されないように指定します。デフォルト: すべてのメソッドがINSTANTIABLEです。

NOT INSTANTIABLEの制限

NOT INSTANTIABLEを指定した場合は、FINALSTATICも指定できません。

関連項目:

constructor_spec

subprogram_spec

ADT属性として参照されるサブプログラムを指定します。このようなサブプログラムには、それぞれの対応するメソッド本体をADT本体に指定する必要があります。

subprogram_specの制限

MEMBERメソッドをサブタイプ内で再定義するサブタイプに対してSTATICメソッドを定義することはできません。逆も同様です。

MEMBER

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

関連項目:

「例14-30」

STATIC

ADTに関連付けられたサブプログラムです。MEMBERメソッドとは異なり、STATICメソッドに暗黙的なパラメータはありません。本体でSELFを参照することはできません。通常、type_name.method()として起動されます。

STATICの制限

  • JavaクラスのMEMBERメソッドをSQLJオブジェクト型のSTATICメソッドにマップすることはできません。

  • MEMBERメソッドの場合も、STATICメソッドの場合も、プロシージャの仕様部またはファンクションの仕様部に対応するメソッド本体を型本体に指定する必要があります。

関連項目:

「例14-31」

procedure_specまたはfunction_spec

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

procedure_specまたはfunction_specの制限

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

return_clause

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

関連項目:

メソッドおよびメソッドの起動の詳細は、「コレクション・メソッドの起動」を参照してください

constructor_spec

ADTの初期化インスタンスを戻すファンクションであるユーザー定義コンストラクタを作成します。各コンストラクタのパラメータの数、順序またはデータ型が異なる場合は、1つのADTに対して複数のコンストラクタを宣言できます。

  • ユーザー定義コンストラクタ・ファンクションは常にFINALおよびINSTANTIABLEであるため、これらのキーワードはオプションです。

  • ユーザー定義コンストラクタのパラメータの引渡しモードは常にSELF IN OUTです。そのため、意味を明確にするために指定する場合を除き、この句を指定する必要はありません。

  • RETURN SELF AS RESULTは、コンストラクタによって戻される値の実行時型が、SELF引数の実行時型になるように指定します。

関連項目:

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

map_order_function_spec

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

いずれのメソッドも宣言しない場合、オブジェクト・インスタンスに関して比較できるのは等しいか等しくないかについてのみです。同じ型定義のインスタンスは、それぞれの対応する属性の各ペアが等しい場合にのみ等しくなります。2つのADTが等しいかどうかを判断するために、比較メソッドを指定しないでください。

サブタイプにはMAPおよびORDERメソッドのいずれも宣言できません。ただし、スーパータイプでNOT FINAL 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メソッド)を指定します。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メンバー・ファンクション(ORDERメソッド)を指定します。負の整数、0(ゼロ)または正の整数は、暗黙的なSELF引数が明示的な引数より小さいか、等しいかまたは大きいことを示します。

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

同じADT定義のインスタンスをORDER BY句で比較すると、ORDERメソッド・ファンクションが起動されます。

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

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

map_order_function_specの制限

サブタイプにORDERメソッドを追加することはできません。

restrict_references_pragma

非推奨の句です。「RESTRICT_REFERENCESプラグマ」を参照してください。

restrict_references_pragmaの制限

この句は、メソッドを削除する場合には無効です。