SQL/MM 標準では、ANSI/SQL CREATE TYPE 文に基づいて構築される拡張ユーザー定義型 (UDT) として空間データのサポートが定義されています。SQL Anywhere ではユーザー定義型はサポートされませんが、サポートされているかのように SQL Anywhere の空間データサポートが実装されています。
次のように、コンストラクターを呼び出すことによって、ユーザー定義型の値をインスタンス化できます。
NEW type-name( argument-list)
たとえば、クエリに次のように指定して、2 つの ST_Point 値をインスタンス化できます。
SELECT NEW ST_Point(), NEW ST_Point(3,4) |
SQL Anywhere では、通常のオーバーロード解決ルールを使用して、argument-list を定義済みコンストラクターと照合します。次の状況では、エラーが返されます。
NEW がユーザー定義型ではないタイプで使用された場合
ユーザー定義型がインスタンス化可能ではない場合 (たとえば、ST_Geometry はインスタンス化可能なタイプではありません)
指定された引数型と一致するオーバーロードがない場合
次の項を参照してください。
ユーザー定義型には、インスタンスメソッドが定義されていることがあります。インスタンスメソッドは、次のようにしてタイプの値に対して呼び出されます。
value-expression.method-name( argument-list )
たとえば、次の架空の例では、Massdata.CenterPoint カラムの X 座標を SELECT しています。
SELECT CenterPoint.ST_X() FROM Massdata; |
CenterPoint というユーザー ID がある場合、データベースサーバーでは CenterPoint.ST_X()
が「あいまい」であると見なされます。これは、この文が「ユーザー CenterPoint が所有するユーザー定義関数 ST_X を呼び出す」(この文の意図しない意味) とも、「Massdata.CenterPoint カラムの ST_X メソッドを呼び出す」(正しい意味)
とも考えられるためです。データベースサーバーは、最初に CenterPoint という名前のユーザーに対して、大文字小文字を区別した検索を実行することによって、このようなあいまいさを解決します。ユーザーが見つかった場合、データベースサーバーは、ユーザー
CenterPoint が所有する ST_X というユーザー定義関数を呼び出していると見なして処理を続行します。見つからなかった場合には、データベースサーバーは、構成体をメソッド呼び出しとして処理し、Massdata.CenterPoint カラムの
ST_X メソッドを呼び出します。
次の場合、インスタンスメソッド呼び出しはエラーを返します。
value-expression の宣言されたタイプがユーザー定義型ではない
value-expression またはそのスーパータイプの 1 つの宣言されたタイプに、名前付きメソッドが定義されていない
argument-list が、名前付きメソッドに対して定義されたオーバーロードのいずれとも一致しない
次の項を参照してください。
ANSI/SQL 標準では、インスタンスメソッドに加えて、ユーザー定義型に静的メソッドを関連付けることができます。静的メソッドは次の構文を使用して呼び出されます。
type-name::method-name( argument-list )
たとえば、次の文はテキストを解析することによって ST_Point をインスタンス化します。
SELECT ST_Geometry::ST_GeomFromText('POINT( 5 6 )') |
次の場合、静的メソッド呼び出しはエラーを返します。
value-expression の宣言されたタイプがユーザー定義型ではない
value-expression またはそのスーパータイプの 1 つの宣言されたタイプに、名前付きメソッドが定義されていない
argument-list が、名前付きメソッドに対して定義されたオーバーロードのいずれとも一致しない
次の項を参照してください。
ANSI/SQL の拡張として、SQL Anywhere では、ユーザー定義の集約を実装する静的メソッドをサポートしています。次に例を示します。
SELECT ST_Geometry::ST_AsSVGAggr(T.geo) FROM table T |
静的メソッドのオーバーロードは、すべてが集約であるか、またはすべてが集約ではないかのいずれかである必要があります。
次の場合、静的集約メソッド呼び出しはエラーを返します。
静的メソッド呼び出しがエラーを返す場合
組み込み集合関数がエラーを返す場合
WINDOW 句が指定されている場合
次の項を参照してください。
ANSI/SQL 標準では、文で値の具象タイプ (他の言語ではオブジェクトタイプとも呼ばれる) を検査できる型述部が定義されています。構文は次のとおりです。
value IS [ NOT ] OF ( [ ONLY ] type-name,...)
value が NULL の場合、述部は UNKNOWN を返します。それ以外の場合、value の具象タイプが type-name リストの各要素と比較されます。ONLY が指定されている場合、具象タイプが指定されたタイプと同一である場合に一致と見なされます。それ以外の場合は、具象タイプが指定されたタイプまたは派生タイプ (サブタイプ) である場合に一致と見なされます。
value の具象タイプがリスト内のいずれかの要素と一致した場合は TRUE が返され、それ以外の場合は FALSE が返されます。
次の例では、Shape カラムの値に具象タイプ ST_Curve またはそのサブタイプの 1 つ (ST_LineString、ST_CircularString、または ST_CompoundCurve) が含まれているすべてのローを返します。
SELECT * FROM SpatialShapes WHERE Shape IS OF ( ST_Curve ); |
次の項を参照してください。
ANSI/SQL 標準では、式の宣言されたタイプをスーパータイプからサブタイプに効率的に変換できる、サブタイプ処理式が定義されています。式の具象タイプ (別の言語ではオブジェクトタイプとも呼ばれる) が指定したサブタイプ、または指定したサブタイプのサブタイプであることがわかっている場合には、この式を使用できます。CAST 関数で値のコピーが作成されるのに対して、TREAT ではコピーが作成されないため、これは CAST 関数を使用するよりも効率的な方法です。構文は次のとおりです。
TREAT( value-expression AS target-subtype )
エラー状況が発生しない場合、結果は target-subtype で宣言されたタイプの value-expression となります。
次の場合、サブタイプ処理式はエラーを返します。
value-expression がユーザー定義型ではない場合
target-subtype が value-expression の宣言されたタイプのサブタイプではない場合
value-expression の動的タイプが target-subtype のサブタイプではない場合
次の例では、ST_Geometry の Shape カラムの宣言されたタイプを効率的な ST_Curve サブタイプに変更することによって、ST_Curve タイプの ST_Length メソッドを呼び出せるようにしています。
SELECT ShapeID, TREAT( Shape AS ST_Curve ).ST_Length() FROM SpatialShapes WHERE Shape IS OF ( ST_Curve ); |
次の項を参照してください。
![]() |
DocCommentXchange で意見交換できます
|
Copyright © 2012, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.1 |