ユーザー定義タイプ

ユーザー定義のデータ・タイプ (UDT) は、既存のデータ・タイプから派生したデータ・タイプです。 UDT を使用すると、既に使用可能になっている組み込みタイプを拡張し、独自にカスタマイズしたデータ・タイプを作成できます。

ユーザー定義タイプには以下の 6 つがあります。
  • 特殊タイプ
  • 構造化タイプ
  • 参照タイプ
  • 配列タイプ
  • 行タイプ
  • カーソル・タイプ
これらのそれぞれのタイプについて、次の項で説明します。

特殊タイプ

特殊タイプ とは、 内部表記を既存の組み込みデータ・タイプ (その「ソース」タイプ) と共有するユーザー定義のデータ・タイプです。

特殊タイプには、修飾子付き ID が組み込まれます。 CREATE TYPE (Distinct)、DROP、または COMMENT ステートメント以外で特殊タイプ名が使用されるとき、スキーマ名によってそれが修飾されていない場合は、SQL パスを順に調べて、特殊タイプの一致する最初のスキーマが探索されます。

LOB タイプをソースとする特殊タイプは、そのソース・タイプと同じ制限に従います。

特殊タイプは、厳密な型判定の規則または緩やかな型判定の規則を使用するように定義されます。 厳密な型判定の規則がデフォルトです。
厳密に型付けされた特殊タイプ
厳密に型付けされた特殊タイプは、ほとんどの操作で、非互換の別個のタイプと見なされます。 例えば、ピクチャー・タイプ、テキスト・タイプ、 音声タイプを定義することもできます。 これらのタイプのセマンティクスはそれぞれ異なりますが、内部表記としては組み込みデータ・タイプ BLOB を使用します。
次に、AUDIO という名前の特殊タイプを作成する例を示します。
   CREATE TYPE AUDIO  AS BLOB (1M)
AUDIO は組み込みデータ・タイプの BLOB と内部表記は同じですが、別個のタイプと見なされます。この考慮事項により、AUDIO 用に特別に関数を作成できるようになり、そのような関数は他のどのデータ・タイプ (ピクチャーやテキストなど) の値にも決して適用されません。

厳密に型付けされた特殊タイプを使用すると、そのインスタンスに対しては、明示的にこの特殊タイプに基づいて定義された関数や演算子しか適用されないようになるため、強力な型判定がサポートされます。 そのため、厳密に型付けされた特殊タイプはそのソース・タイプの関数や演算子を自動的には獲得しません。そのような関数や演算子は無意味である可能性があるためです。 例えば、データ・タイプが AUDIO で、バイト単位ではなく秒単位でオブジェクトの長さを戻すパラメーターをサポートするように、LENGTH 関数を定義することもできます。

緩やかに型付けされた特殊タイプ
緩やかに型付けされた特殊タイプは、すべての操作でそのソース・タイプと同じと見なされますが、緩やかに型付けされた特殊タイプが代入中やキャスト中に値に関する制約を適用する場合は例外です。 この考慮事項は、関数解決にも適用されます。
次に、POSITIVEINTEGER という名前の特殊タイプを作成する例を示します。
   CREATE TYPE POSITIVEINTEGER AS INTEGER
         WITH WEAK TYPE RULES CHECK (VALUE>=0)
緩やかな型判定は、正整数値のみを受け入れることを除いて、POSITIVEINTEGER がその基礎データ・タイプの INTEGER と同じ方法で作動することを意味します。

緩やかに型付けされた特殊タイプは、アプリケーション・コード内の組み込みデータ・タイプを参照する方法の代替方法として使用できます。 この特殊タイプに関連付けられている値に関する制約を定義する機能により、代入中やキャスト中に値を検査するメソッドが提供されます。

特殊タイプを使用すると、以下のカテゴリーで利点があります。
拡張性
新しいデータ・タイプを定義すると、アプリケーションをサポートするために使用できるデータ・タイプのセットが増えます。
柔軟性
ユーザー定義関数 (UDF) を使用して新しいデータ・タイプのセマンティクスや動作を指定し、システムで使用できるさまざまなデータ・タイプを増やすことができます。
一貫性があり継承される動作
厳密な型判定は、ご使用の特殊タイプで定義された関数のみを特殊タイプのインスタンスに適用できることを保証します。 緩やかな型判定は、特殊タイプの動作がその基礎データ・タイプと同じになることを保証するので、この基礎タイプで使用可能なすべての関数やメソッドを使用できます。
カプセル化
緩やかに型付けされた特殊タイプを使用すると、アプリケーション・コード内のこの特殊タイプのすべてのインスタンスについて、データ・タイプ制約を 1 箇所で定義できます。
パフォーマンス
特殊タイプはデータベース・マネージャーに高度に統合されます。 特殊タイプは、内部的には組み込みデータ・タイプと同じ方法で表現されるので、組み込みデータ・タイプの組み込み関数、比較演算子、索引などのコンポーネントを実装に使用されるものと同じ効率的なコードを共有します。

特殊タイプを定義するためにすべての組み込みデータ・タイプが使用できるわけではありません。 ソース・データ・タイプを XML、配列、行、カーソルにすることはできません。 詳しくは、 CREATE TYPE (特殊) ステートメントを参照してください。

構造化タイプ

構造化タイプ とは、 データベースに定義されている構造を持つユーザー定義のデータ・タイプのことです。 これには、名前が付けられている一連の属性 が入っており、 それぞれにデータ・タイプがあります。 構造化タイプには、一連のメソッド仕様も組み込まれています。

構造化タイプは、表、ビュー、列のタイプとして使用できます。 表またはビューのタイプとして使用する場合、その表またはビューは、 型付き表 または型付きビュー となります。 型付き表および型付きビューの場合、 構造化タイプの属性の名前およびデータ・タイプは、 型付き表または型付きビューの列の名前およびデータ・タイプになります。 型付き表または型付きビューの行は、 構造化タイプのインスタンスの表示と考えることができます。 列のデータ・タイプとして使用する場合、その列には該当する構造化タイプの値 (または、このセクションで後ほど定義するように、該当するタイプのサブタイプの値) が入ります。 構造列オブジェクトの属性を取り出して処理するときには、メソッドを使います。

スーパータイプ とは、サブタイプ と呼ばれる他の構造化タイプが定義されている構造化タイプのことです。 サブタイプは、そのスーパータイプのすべての属性とメソッドを継承し、追加の属性やメソッドを定義することもできます。 共通のスーパータイプに関連する構造化タイプのセットはタイプ階層 と呼ばれ、それより上位のスーパータイプを持たないタイプをそのタイプ階層のルート・タイプ と呼びます。

サブタイプという用語は、 タイプ階層において 1 つのユーザー定義の構造化タイプおよびその下にあるすべてのユーザー定義の構造化タイプを指して用いられます。 したがって、階層内における構造化タイプ T のサブタイプは、 T と、T の下にあるすべての構造化タイプになります。 構造化タイプ T の厳密な意味でのサブタイプ とは、 タイプ階層で T の下にある構造化タイプのことです。

タイプ階層内での再帰的タイプ定義に対しては、いくつかの制限があります。 このため、許可されている特定タイプの再帰的定義を参照するために、 簡単な方法を考える必要があります。 以下の定義が使われます。
  • 直接的な使用: 以下の文のいずれか 1 つが当てはまる場合のみ、タイプ A は、別のタイプ B を直接使用します。
    1. タイプ A に、タイプ B の属性がある。
    2. タイプ B は、 Aのサブタイプ、または Aのスーパータイプです。
  • 間接的な使用: 以下の文のいずれか 1 つが当てはまる場合、タイプ A は、タイプ B を間接的に使用します。
    1. タイプ A がタイプ B を直接的に使用する。
    2. タイプ A が何らかのタイプ C を直接的に使用し、タイプ C がタイプ B を間接的に使用する。

いずれかの属性タイプがそれ自体を直接的または間接的に使用するように、タイプを定義することはできません。 そのような構成を作成する必要がある場合、参照を属性として使うことを考慮してください。 例えば、構造化タイプ属性では、「管理職」が属性タイプ「従業員」である場合に、 「管理職」の属性を持つ「従業員」のインスタンスというものはあり得ません。 しかし、REF (従業員) のタイプを持つ「管理職」の属性はあり得ます。

他の特定のオブジェクトが、あるタイプを直接または間接的に使っている場合、 そのタイプをドロップすることはできません。 例えば、表またはビューの列が、タイプを直接または間接的に使っている場合、 タイプをドロップすることはできません。

参照タイプ

参照タイプ は構造化タイプと対になっているタイプです。 特殊タイプに似て、 参照タイプは組み込みデータ・タイプの 1 つと共通の表記を使用するスカラー・タイプです。 この同じ表記はタイプ階層のすべてのタイプで共有されます。 参照型付き表記は、タイプ階層のルート・タイプの作成時に定義されます。 参照タイプを使用する場合、構造化タイプはタイプのパラメーターとして指定されます。 このパラメーターを、参照のターゲット・タイプ といいます。

参照のターゲットは、通常、型付き表または型付きビューの行です。 参照タイプを使用する場合、有効範囲 を定義することができます。 有効範囲は、 参照値のターゲット行がある表 (ターゲット表 と呼ばれる) またはビュー (ターゲット・ビュー と呼ばれる) を指定します。 ターゲット表またはターゲット・ビューは、 参照タイプのターゲット・タイプと同じタイプでなければなりません。 効力範囲を持つ参照タイプのインスタンスは、 型付き表または型付きビューの行 (ターゲット行 と呼ばれる) を固有識別します。

配列タイプ

ユーザー定義の配列タイプ とは、別のデータ・タイプのエレメントを持つ配列として定義されているデータ・タイプのことをいいます。 すべての通常配列タイプには、データ・タイプが INTEGER の索引と、定義済みの最大カーディナリティーがあります。 すべての連想配列には、データ・タイプが INTEGER または VARCHAR の索引があり、定義済みの最大カーディナリティーはありません。

行タイプ

行タイプ とは、順序付けられた一連の指定されたフィールドで定義され、各フィールドには関連付けられたデータ・タイプがあり、事実上 1 つの行を表しているデータ・タイプのことです。 行タイプは、行のデータの簡単な操作を提供するために SQL PL 内の変数とパラメーター用のデータ・タイプとして使用できます。

カーソル・タイプ

ユーザー定義のカーソル・タイプ とは、CURSOR キーワードと、オプションで関連した行タイプを付けて定義されたユーザー定義のデータ・タイプのことです。 関連付けられた行タイプのあるユーザー定義カーソル・タイプは、厳密に型付けされたカーソル・タイプ です。関連付けられた行タイプがない場合は、緩やかに型付けされたカーソル・タイプ になります。 ユーザー定義のカーソル・タイプの値は、基礎となるカーソルへの参照を表します。