Der SQL/MM-Standard definiert die Unterstützung für räumliche Daten hinsichtlich benutzerdefinierter erweiterter Typen (UDTs, User-defined Extended Types), die mit der Anweisung ANSI/SQL CREATE TYPE erstellt werden. Wenngleich SQL Anywhere keine benutzerdefinierten Typen unterstützt, ist die Unterstützung für räumliche Daten durch SQL Anywhere so implementiert, als würden sie unterstützt.
Sie können einen Wert eines benutzerdefinierten Datentyps instanziieren, indem Sie einen Konstruktor wie folgt aufrufen:
NEW type-name( argument-list)
Eine Abfrage könnte z. B. Folgendes enthalten, um zwei ST_Point-Werte zu instanziieren:
SELECT NEW ST_Point(), NEW ST_Point(3,4) |
SQL Anywhere vergleicht die argument-list mit den definierten Konstruktoren unter Benutzung der normalen Regeln zur Auflösung von Überladungen. In folgenden Situationen wird ein Fehler zurückgegeben:
Wenn für einen nicht benutzerdefinierten Typ NEW verwendet wird.
Wenn der benutzerdefinierte Typ nicht instanziierbar ist (ST_Geometry ist z. B. ein nicht-instanziierbarer Typ).
Wenn keine Überladung vorliegt, die mit den bereitgestellten Argumenttypen übereinstimmt.
Siehe:
Für benutzerdefinierte Typen können Instanzmethoden definiert werden. Instanzmethoden werden wie folgt für einen Wert des Typs aufgerufen:
value-expression.method-name( argument-list )
Folgendes fiktive Beispiel wählt die X-Koordinate der Spalte Massdata.CenterPoint aus:
SELECT CenterPoint.ST_X() FROM Massdata; |
Wenn es eine Benutzer-ID namens CenterPoint gibt, betrachtet der Datenbankserver CenterPoint.ST_X()
als mehrdeutig. Der Grund hierfür ist, dass die Anweisung bedeuten könnte: "Aufruf der benutzerdefinierten Funktion ST_X, die dem Benutzer
CenterPoint gehört" (nicht das gewünschte Ergebnis). Oder sie könnte bedeuten: "Aufruf der ST_X-Methode für die Spalte Massdata.CenterPoint"
(das gewünschte Ergebnis). Der Datenbankserver löst die Mehrdeutigkeit auf, indem er zuerst eine Suche ohne Beachtung der
Groß-/Kleinschreibung nach einem Benutzer mit dem Namen CenterPoint durchführt. Wenn einer gefunden wird, verhält sich der
Datenbankserver so, als ob eine benutzerdefinierte Funktion namens ST_X aufgerufen würde, die dem Benutzer CenterPoint gehört.
Wenn kein Benutzer gefunden wird, behandelt der Datenbankserver das Konstrukt als Methodenaufruf und ruft die ST_X-Methode
für die Spalte Massdata.CenterPoint auf.
Der Aufruf einer Instanzmethode gibt in folgenden Fällen einen Fehler zurück:
Wenn der deklarierte Typ von value-expression kein benutzerdefinierter Typ ist.
Wenn die benannte Methode nicht im deklarierten Typ von value-expression oder einem seiner Obertypen definiert ist.
Wenn argument-list mit keiner der definierten Überladungen für die Methode übereinstimmt.
Siehe:
Zusätzlich zu Instanzmethoden erlaubt es der ANSI/SQL-Standard, benutzerdefinierten Typen statische Methoden zuzuordnen. Diese werden mit der folgenden Syntax aufgerufen:
type-name::method-name( argument-list )
Folgende Anweisung instanziiert z. B. einen ST_Point durch die syntaktische Analyse von Text:
SELECT ST_Geometry::ST_GeomFromText('POINT( 5 6 )') |
Der Aufruf einer statischen Methode gibt in folgenden Fällen einen Fehler zurück:
Wenn der deklarierte Typ von value-expression kein benutzerdefinierter Typ ist.
Wenn die Methode nicht im Typ von type-value-expression oder einem seiner Obertypen definiert ist.
Wenn argument-list mit keiner der definierten Überladungen für die benannte Methode übereinstimmt.
Siehe:
Als Erweiterung zu ANSI/SQL unterstützt SQL Anywhere statische Methoden, die benutzerdefinierte Aggregate implementieren. Beispiel:
SELECT ST_Geometry::ST_AsSVGAggr(T.geo) FROM table T |
Alle Überladungen für eine statische Methode müssen Aggregate sein oder keine von ihnen darf ein Aggregat sein.
Der Aufruf einer statischen Aggregatmethode gibt in folgenden Fällen einen Fehler zurück:
Wenn der Aufruf einer statischen Methode einen Fehler liefern würde
Wenn eine integrierte Aggregatfunktion einen Fehler liefern würde
Wenn eine WINDOW-Klausel angegeben wurde
Siehe:
Der ANSI/SQL-Standard definiert Typenprädikate, die es einer Anweisung gestatten, den konkreten Typ (in anderen Sprachen auch als Objekttyp bezeichnet) eines Werts zu überprüfen. Die Syntax lautet wie folgt:
value IS [ NOT ] OF ( [ ONLY ] type-name,...)
Wenn value NULL ist, gibt das Prädikat UNKNOWN zurück. Andernfalls wird der konkrete Typ von value mit den einzelnen Elementen in der Liste type-name verglichen. Wenn ONLY angegeben wurde, liegt eine Übereinstimmung vor, wenn der konkrete Typ genau dem angegebenen Typ entspricht. Andernfalls liegt eine Übereinstimmung vor, wenn der konkrete Typ der angegebene Typ oder ein abgeleiteter Typ (Subtyp) ist.
Wenn der konkrete Typ von value mit einem der Elemente in der Liste übereinstimmt, wird TRUE zurückgegeben, andernfalls FALSE.
Das folgende Beispiel gibt alle Zeilen zurück, in denen der Wert der Shape-Spalte den konkreten Typ ST_Curve oder einen seiner Subtypen (ST_LineString, ST_CircularString oder ST_CompoundCurve) hat:
SELECT * FROM SpatialShapes WHERE Shape IS OF ( ST_Curve ); |
Siehe:
Der ANSI/SQL-Standard definiert einen Subtyp-Behandlungsausdruck, der es ermöglicht, den deklarierten Typ eines Ausdrucks effizient von einem Obertyp in einen Subtyp zu ändern. Dieser kann verwendet werden, wenn Sie wissen, dass der konkrete Typ (in anderen Sprachen auch als Objekttyp bezeichnet) des Ausdrucks der angegebene Subtyp oder ein Subtyp des angegebenen Subtyps ist. Dies ist effizienter als die Verwendung der CAST-Funktion, da diese eine Kopie des Werts erstellt, während TREAT keine Kopie erstellt. Die Syntax lautet wie folgt:
TREAT( value-expression AS target-subtype )
Wenn keine Fehlerbedingung ausgegeben wird, ist das Ergebnis der value-expression mit dem deklarierten target-subtype.
Der Ausdruck zur Subtypbehandlung gibt in folgenden Fällen einen Fehler zurück:
Wenn value-expression kein benutzerdefinierter Typ ist
Wenn target-subtype kein Subtyp des deklarierten Typs von value-expression ist
Wenn der dynamische Typ von value-expression kein Subtyp von target-subtype ist
Im folgenden Beispiel wird der deklarierte Typ ST_Geometry der Shape-Spalte in den ST_Curve-Subtyp geändert, sodass die ST_Length-Methode des Typs ST_Curve aufgerufen werden kann:
SELECT ShapeID, TREAT( Shape AS ST_Curve ).ST_Length() FROM SpatialShapes WHERE Shape IS OF ( ST_Curve ); |
Siehe:
![]() |
Kommentieren Sie diese Seite in DocCommentXchange.
|
Copyright © 2013, SAP AG oder ein SAP-Konzernunternehmen. - SAP Sybase SQL Anywhere 16.0 |