特殊タイプ とは、 内部表記を既存のタイプ (その "ソース"・タイプ) と共用するユーザー定義のデータ・タイプです。 しかし、特殊タイプはほとんどの操作で、非互換の別個のタイプとみなされます。 たとえば、ピクチャー・タイプ、テキスト・タイプ、 音声タイプを定義しようとする場合、これらのタイプの意味はどれも異なりますが、 内部表記としては組み込みデータ・タイプ BLOB を使用します。
次に、AUDIO という名前の特殊タイプを作成する例を示します。
CREATE DISTINCT TYPE AUDIO AS BLOB (1M)
AUDIO は組み込みデータ・タイプの BLOB と内部表記は同じですが、 BLOB や他のどのタイプとも互換でない、別個のタイプとみなされます。 これにより、AUDIO 用に特別に関数を設定できるようになり、 そのような関数が他のどのタイプ (ピクチャー、テキストなど) にも適用されないことが保証されます。
特殊タイプは、修飾子付き識別子によって識別されます。 CREATE DISTINCT TYPE、DROP DISTINCT TYPE、 または COMMENT ON DISTINCT TYPE ステートメント以外で特殊タイプ名が使用されるとき、 スキーマ名によってそれが修飾されていない場合は、 SQL パス を順に調べて、 特殊タイプの一致する最初のスキーマが探索されます。 SQL パスについては、CURRENT PATH を参照してください。
特殊タイプを使うと、そのインスタンスに対しては、 明示的に特殊タイプに基づいて定義された関数や演算子しか適用されないようになるため、 強力なタイプ識別機能が実現されます。 そのため、特殊タイプはそのソース・タイプの関数や演算子を自動的には獲得しません。 そのようなものは無意味である可能性があるためです。 (たとえば、AUDIO タイプの LENGTH 関数は、 そのオブジェクトの長さをバイト単位ではなく秒単位で戻します。)
LONG VARCHAR、LONG VARGRAPHIC、LOB の各タイプ、 または DATALINK をソースとする特殊タイプは、ソース・タイプと同じ制限に従います。
しかし、特殊タイプのソース・タイプに対して定義された関数をソースとするユーザー定義関数を定義することによって、 ソース・タイプの特定の関数と演算子が特殊タイプに適用されるように明示的に指定することは可能です (例については ユーザー定義タイプの比較を参照)。 ソース・タイプとして LONG VARCHAR、LONG VARGRAPHIC、BLOB、CLOB、 DBCLOB、または DATALINK を使用しているもの以外のユーザー定義特殊タイプについては、 自動的に比較演算子が生成されます。 さらに、ソース・タイプから特殊タイプへ、 また特殊タイプからソース・タイプへのキャストをサポートする関数も生成されます。