SQL Anywhere bietet umfassende SQL-Funktionen, einschließlich: Trigger pro Zeile, pro Anweisung und INSTEAD OF-Trigger, gespeicherte SQL-Prozeduren und benutzerdefinierte Funktionen, RECURSIVE UNION-Abfragen, allgemeine Tabellenausdrücke, Tabellenfunktionen, von LATERAL abgeleitete Tabellen, integrierte Volltextsuche, WINDOW-Aggregatfunktionen, Suche mit regulären Ausdrücken, XML-Unterstützung, materialisierte Ansichten, Snapshot-Isolation und referenzielle Integrität. Dieser Abschnitt beschreibt einige spezifische Funktionen, die von SQL Anywhere unterstützt werden und sich von anderen SQL-Datenbankimplementierungen unterscheiden.
SQL Anywhere hat Datums-, Zeit- und Zeitstempeltypen, die Jahr, Monat, Tag, Stunde, Minute, Sekunde und Sekundenbruchteile umfassen. Für Einfügungen oder Aktualisierungen in Datumsfelder oder Vergleiche mit Datumsfeldern wird ein freies Datumsformat unterstützt.
Zusätzlich sind die folgenden Vorgänge mit Datumsangaben zulässig:
Datum + Ganzzahl Fügt die angegebene Anzahl von Tagen zu einem Datum hinzu
Datum - Ganzzahl Zieht die angegebene Anzahl von Tagen von einem Datum ab
Datum - Datum Berechnet die Anzahl von Tagen zwischen zwei Datumsangaben
Datum + Zeit Macht aus einem Datum und einer Zeit einen Zeitstempel
SQL Anywhere bietet keine Unterstützung für einen INTERVAL-Datentyp, bei dem es sich um die SQL-Sprachfunktion F052 des SQL/2008-Standards handelt. SQL Anywhere bietet jedoch zahlreiche Funktionen für die Bearbeitung von Datums- und Uhrzeitangaben, wie etwa DATEADD.
SQL Anywhere unterstützt sowohl Entitätsintegrität als auch referenzielle Integrität über die PRIMARY KEY- und FOREIGN KEY-Klauseln der Anweisungen CREATE TABLE und ALTER TABLE.
PRIMARY KEY [ CLUSTERED ] ( column-name [ ASC | DESC ], ... ) [NOT NULL] FOREIGN KEY [role-name] [(column-name [ ASC | DESC ], ...) ] REFERENCES table-name [(column-name, ...) ] [ MATCH [ UNIQUE | SIMPLE | FULL ] ] [ ON UPDATE [ CASCADE | RESTRICT | SET DEFAULT | SET NULL ] ] [ ON DELETE [ CASCADE | RESTRICT | SET DEFAULT | SET NULL ] ] [ CHECK ON COMMIT ] [ CLUSTERED ]
Die PRIMARY KEY-Klausel deklariert den Primärschlüssel für die Tabelle. SQL Anywhere erzwingt dann die Eindeutigkeit des Primärschlüssels durch die Erstellung eines eindeutigen Indexes für die Primärschlüsselspalte(n). Zwei SQL Anywhere-Erweiterungen ermöglichen die Anpassung dieses Indexes:
CLUSTERED Das Schlüsselwort CLUSTERED bedeutet, dass der Primärschlüssel-Index ein Clustered-Index ist und daher angrenzende Indexeinträge im Index auf physisch angrenzende Zeilen in der Tabelle zeigen.
ASC | DESC Die Sortierung - aufsteigend oder absteigend - jeder indizierten Spalte im Primärschlüssel-Index kann angepasst werden. Durch diese Anpassung kann gewährleistet werden, dass die Sortierung des Primärschlüsselindexes mit der für spezielle SQL-Abfragen erforderlichen Sortierung, die in den ORDER BY-Klauseln der betreffenden Anweisungen angegeben ist, übereinstimmt.
Die FOREIGN KEY-Klausel legt eine Beziehung zwischen zwei Tabellen fest. Diese Beziehung wird von einer Spalte (oder Spalten) in dieser Tabelle repräsentiert, die Werte im Primärschlüssel einer anderen Tabelle enthalten muss. SQL Anywhere erstellt automatisch einen Index für die einzelnen FOREIGN KEY-Klauseln, die zum Erzwingen der Integritätsregel zur Erhaltung der referenziellen Integrität definiert sind. Die Semantik der Integritätsregel und die physischen Eigenschaften dieses Indexes können wie folgt angepasst werden:
CLUSTERED Das Schlüsselwort CLUSTERED bedeutet, dass der Fremdschlüssel-Index ein Clustered-Index ist und daher angrenzende Indexeinträge im Index auf physisch angrenzende Zeilen in der Fremdtabelle zeigen.
ASC | DESC Die Sortierung - aufsteigend oder absteigend - jeder indizierten Spalte im Fremdschlüsselindex kann angepasst werden. Die Sortierung des Fremdschlüsselindexes unterscheidet sich möglicherweise von der des Primärschlüsselindexes. Die Anpassung der Sortierung kann verwendet werden, um sicherzustellen, dass die Sortierung des Fremdschlüsselindexes mit der für spezielle SQL-Abfragen in der Anwendung erforderlichen Sortierung, die in den ORDER BY-Klauseln der betreffenden Anweisungen angegeben ist, übereinstimmt.
MATCH-Klausel SQL Anywhere unterstützt die MATCH-Klausel, bei der es sich um die SQL-Sprachfunktion F741 des SQL/2008-Standards handelt. Zusätzlich wird in SQL Anywhere MATCH UNIQUE unterstützt, das eine Eins-zu-Eins-Relation zwischen der Primärtabelle und der entfernten Tabelle erzwingt, ohne die Notwendigkeit eines zusätzlichen UNIQUE-Indexes.
SQL Anywhere unterstützt die Erstellung von eindeutigen Indizes, die auch als eindeutige Sekundärindizes bezeichnet werden, für nullwertfähige Spalten. Jeder Indexschlüssel muss standardmäßig eindeutig sein oder in mindestens einer Spalte NULL enthalten. Beispiel: Zwei Indexeinträge ('a', NULL) und ('a', NULL) werden jeweils als eindeutige Indexwerte betrachtet. SQL Anywhere unterstützt auch eindeutige Sekundärindizes, in denen Nullwerte als Spezialwerte in jeder Domäne behandelt werden. Dies wird mithilfe der WITH NULLS NOT DISTINCT-Klausel erreicht. Bei einem solchen Index werden die beiden Wertepaare ('a', NULL) und ('a', NULL) als Duplikate betrachtet.
SQL Anywhere unterstützt INNER-, LEFT OUTER-, RIGHT OUTER- und FULL OUTER-Joins. Zusätzlich zu expliziten Join-Prädikaten werden in SQL Anywhere natürliche Joins unterstützt sowie eine als KEY-Joins bekannte Erweiterung des Herstellers, womit ein implizites Join-Prädikat basierend auf den Fremdschlüsselbeziehungen der Tabellen angegeben wird.
Die internen Vorgänge von SQL Anywhere unterscheiden nicht zwischen Zeichenfolgentypen mit fester und variabler Länge (CHAR, NCHAR oder BINARY). SQL Anywhere kürzt keine nachgestellten Leerzeichen in Zeichenfolgentypen, wenn diese Werte in die Datenbank eingefügt werden. SQL Anywhere unterscheidet zwischen dem Nullwert und der leeren Zeichenfolge. Standardmäßig verwenden SQL Anywhere-Datenbanken eine Kollation ohne Berücksichtigung von Groß- und Kleinschreibung zur Unterstützung von Zeichenfolgenvergleichen, die nicht zwischen Groß- und Kleinschreibung unterscheiden. In SQL Anywhere werden Zeichenfolgendatentypen mit fester Länge nie mit Leerzeichen aufgefüllt. Stattdessen wird die Leerzeichen-Auffüllsemantik während der Ausführung der einzelnen Zeichenfolgenvergleiche simuliert. Diese Semantik unterscheidet sich möglicherweise geringfügig von Zeichenfolgenvergleichen anderer SQL-Implementierungen.
SQL Anywhere unterstützt teilweise die optionale SQL-Sprachfunktion T111, die es einer UPDATE-Anweisung gestattet, eine Ansicht zu referenzieren, die einen Join enthält. Außerdem gestatten es die Anweisungen UPDATE und UPDATE WHERE CURRENT OF, mehr als eine Tabelle in der SET-Klausel der Anweisung zu referenzieren, und die FROM-Klausel einer UPDATE-Anweisung kann aus einem beliebigen Tabellenausdruck mit Joins und abgeleiteten Tabellen bestehen.
SQL Anywhere gestattet es auch, die Anweisungen UPDATE, INSERT, MERGE und DELETE in eine andere SQL-Anweisung als abgeleitete Tabelle einzubetten. Einer der Vorteile dieser Unterstützung ist, dass Sie auf einfache Weise eine Abfrage erstellen können, die die Gruppe von Zeilen liefert, die von einer UPDATE-Anweisung geändert wurde.
Sie können in SQL Anywhere die Ergebnismenge einer gespeicherten Prozedur in der FROM-Klausel einer Anweisung als Tabelle referenzieren. Dieses Feature wird in der Regel als Tabellenfunktion bezeichnet. Bei Tabellenfunktionen handelt es sich um die SQL-Sprachfunktion T326 des SQL/2008-Standards. In dem Standard werden Tabellenfunktionen mit dem TABLE-Schlüsselwort angegeben. In SQL Anywhere ist die Verwendung des TABLE-Schlüsselworts nicht erforderlich. Eine gespeicherte Prozedur kann direkt in der FROM-Klausel referenziert werden, optional mit einem Korrelationsnamen und der Angabe des Schemas der Ergebnismenge, die von der Prozedur zurückgegeben wird.
Das folgende Beispiel verknüpft das Ergebnis der gespeicherten Prozedur ShowCustomerProducts mit der Basistabelle "Products". Die Referenz der gespeicherten Prozedur wird von einer expliziten Deklaration des Schemas des Prozedurergebnisses unter Verwendung der WITH-Klausel begleitet:
SELECT sp.ident, sp.quantity, Products.name FROM ShowCustomerProducts( 149 ) WITH ( ident INT, description CHAR(20), quantity INT ) sp JOIN Products ON sp.ident = Products.ID |
SQL Anywhere unterstützt materialisierten Ansichten, bei denen es sich um vorberechnete Ergebnismengen handelt, die direkt oder indirekt innerhalb einer SQL-Abfrage referenziert werden können. In SQL Anywhere können sofort und manuell verwaltete Ansichten mit der VIEW MATERIALIZED CREATE-Anweisung erstellt werden. Andere Datenbankprodukte verwenden möglicherweise andere Begriffe zur Beschreibung dieser Funktion.
SQL Anywhere unterstützt die optionale SQL-Sprachenfunktion F431 des SQL/2008-Standards. In SQL Anywhere sind alle Cursor bidirektional scrollfähig, es sei denn, sie werden explizit als FORWARD ONLY deklariert. Anwendungen können durch einen Cursor blättern, indem sie in der FETCH-Anweisung die relative oder absolute Positionierung oder deren Äquivalent anderer Schnittstellen für die Anwendungsprogrammierung wie ODBC verwenden.
SQL Anywhere unterstützt wertempfindliche Cursor sowie Cursor, die nach Zeilenmitgliedschaft unterscheiden. Allgemein übliche Cursortypen, einschließlich INSENSITIVE-, KEYSET-DRIVEN- und SENSITIVE-Cursor, werden ebenfalls unterstützt. Bei der Verwendung von Embedded SQL können Cursor-Positionen frei in der Anweisung FETCH verschoben werden. Cursor können vorwärts und rückwärts, relativ zur aktuellen Position oder einer angegebenen Anzahl von Datensätzen vom Anfang oder Ende des Cursors verschoben werden.
Standardmäßig sind Cursor in Embedded SQL- und SQL-Prozeduren, benutzerdefinierten Funktionen und Triggern aktualisierbar. Sie können mit der FOR UPDATE-Klausel explizit aktualisierbar gemacht werden. Durch die Angabe der FOR UPDATE-Klausel alleine werden jedoch keine Sperren für die Zeilen in der Ergebnismenge des Cursors erworben. Um sicherzustellen, dass die Zeilen in der Ergebnismenge nicht durch andere Transaktionen geändert werden können, können Sie eine der folgenden beiden Klauseln verwenden:
FOR UPDATE BY LOCK Diese Klausel bewirkt, dass der Datenbankserver Absichtszeilensperren für abgerufene Zeilen der Ergebnismenge erwirbt. Dies sind langfristige Sperren, die gehalten werden, bis die Transaktion festgeschrieben oder zurückgesetzt wird.
FOR UPDATE BY { VALUES | TIMESTAMP } Der SQL Anywhere-Datenbankserver verwendet einen Keyset-gesteuerten Cursor, damit die Anwendung benachrichtigt werden kann, wenn Zeilen geändert oder gelöscht werden, während die Ergebnismenge durchlaufen wird.
SQL Anywhere erlaubt, dass Aliasausdrücke in der SELECT-Liste einer Abfrage in anderen Teilen der Abfrage referenziert werden. Die meisten anderen SQL-Implementierungen und der Standard SQL/2008 lassen dieses Verhalten nicht zu. Sie können z.B. folgende SQL-Abfrage verwenden:
SELECT column-or-expression AS alias-name FROM table-reference WHERE alias-name = expression |
Aliasnamen können an einer beliebigen Stelle im SELECT-Block verwendet werden, auch in anderen SELECT-Listenausdrücken, die wiederum zusätzliche Aliase festlegen. Zyklische Aliasreferenzen sind nicht zulässig. Wenn der für einen Ausdruck angegebene Alias mit dem Namen einer Spalte oder Variablen im Namespace des SELECT-Blocks identisch ist, schließt die Aliasdefinition die Spalte oder Variable aus. Spaltennamen können jedoch in solchen Fällen explizit mit Tabellennamen qualifiziert werden.
SQL Anywhere unterstützt die Snapshot-Isolation, die auch als Multi-Version Concurrency Control (MVCC) bezeichnet wird. In anderen SQL-Implementierungen, die die Snapshot-Isolation unterstützen, werden Schreibvorgangskonflikte, d.h. gleichzeitige Aktualisierungen durch zwei oder mehr Transaktionen für dieselbe Zeile, erst zum Zeitpunkt des COMMIT erkannt. In diesen Fällen gewinnt in der Regel die erste COMMIT-Anweisung und die anderen am Konflikt beteiligten Transaktionen müssen abgebrochen werden.
In SQL Anywhere werden bei Schreibvorgängen für Zeilen Schreibsperren für Zeilen erworben, sodass Snapshot-Transaktionen neben Transaktionen vorhanden sein können, die auf ANSI-Isolationsstufen ausgeführt werden. Aus diesem Grund führt ein Schreibvorgangskonflikt in SQL Anywhere zu einer Blockierung. Das genaue Verhalten kann durch die Verbindungsoptionen BLOCKING und BLOCKING_TIMEOUT gesteuert werden.
![]() |
Kommentieren Sie diese Seite in DocCommentXchange.
|
Copyright © 2013, SAP AG oder ein SAP-Konzernunternehmen. - SAP Sybase SQL Anywhere 16.0 |