28 Cursor § Cursor erlauben eines zeilenweise Verarbeitung einer Tabelle oder eines Anfrageergebnisses in Transact-SQL § Cursor sind grob vergleichbar mit Iteratoren in modernen Programmiersprachen wie Java; ein wichtiger Unterschied ist, dass prinzipiell auch eine Veränderung der zugrundeliegenden Daten möglich ist Datenbanken / Kapitel 10: Programmieren in SQL
32
Embed
Cursor - swl.htwsaar.de · 30 Definition eines Cursors § Bei Definition eines Cursors ist festzulegen, ob er § nur lesend oder auch schreibend auf das Ergebnis zugreift § sich
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
28
Cursor
§ Cursor erlauben eines zeilenweise Verarbeitung einer Tabelle oder eines Anfrageergebnissesin Transact-SQL
§ Cursor sind grob vergleichbar mit Iteratoren in modernen Programmiersprachen wie Java; ein wichtiger Unterschied ist, dass prinzipiell auch eine Veränderung der zugrundeliegenden Daten möglich ist
Datenbanken / Kapitel 10: Programmieren in SQL
29
Cursor
§ Verwendung eines Cursors in Transact-SQL wie folgt
1. Definition des Cursors
2. Öffnen des definierten Cursors
3. Abrufen von Informationen aus dem Cursor(z.B. einer Datensatzes) und Durchführungder gewünschten Operationen
4. Schließen des Cursors
5. Löschen der Definition des Cursors
Datenbanken / Kapitel 10: Programmieren in SQL
30
Definition eines Cursors§ Bei Definition eines Cursors ist festzulegen, ob er
§ nur lesend oder auch schreibendauf das Ergebnis zugreift
§ sich nur vorwärts oder auch rückwärtsdurch das Ergebnis bewegen kann
§ zwischenzeitliche Datenänderungenim Ergebnis sehen soll
Datenbanken / Kapitel 10: Programmieren in SQL
31
Definition eines Cursors§ Definition eines Cursors mittels DECLARE-Kommando
§ Ob der Cursor nur lesend oder auch schreibend zugreift
Öffnen und Bewegen eines Cursors§ Öffnen eines Cursors mittels OPEN-Kommando
§ Bewegen des Cursors erfolgt mittels FETCH-Kommandos
§ NEXT liest nächste Zeile; PRIOR liest vorherige Zeile
§ FIRST liest erste Zeile; LAST liest letzte Zeile
§ ABSOLUTE n liest n-te Zeile (nur bei STATIC)
§ RELATIVE n liest n-te Zeile vor/nach aktueller Zeile
Datenbanken / Kapitel 10: Programmieren in SQL
1 OPEN <Name des Cursors >
1 FETCH2 [NEXT | PRIOR | FIRST | LAST | ABSOLUTE n | RELATIVE n]3 FROM <Name des Cursors >4 INTO <lokale Variable >
35
Cursor-Status§ Beim Bewegen des Cursors wird in der globalen Variable@@FETCH_STATUS ein Status zurückgegeben; dieser kann ausgelesen werden, um Fehler zu erkennen bzw. dieBewegung des Cursors zu steuern
§ Werte der Variable @@FETCH_STATUS
§ 0 : alles in Ordnung
§ -1 : Operation außerhalb des Cursors
§ -2 : Zeile nicht vorhanden
Datenbanken / Kapitel 10: Programmieren in SQL
36
Schließen und Entfernen eines Cursors§ Schließen eines Cursors mittels CLOSE-Kommando
§ Entfernen eines Cursors mittels DEALLOCATE-Kommando
Datenbanken / Kapitel 10: Programmieren in SQL
1 CLOSE <Name des Cursors >
1 DEALLOCATE <Name des Cursors >
37
Beispiel Cursor§ Beispiel: Gib die Namen und Vornamen aller Studenten
in einem höheren als dem zehnten Semester aus
Datenbanken / Kapitel 10: Programmieren in SQL
1 -- Cursor und lokale Variablen deklarieren2 DECLARE StudentenCursor CURSOR FAST_FORWARD3 FOR SELECT Vorname , Name FROM Studenten WHERE Semester > 10
§ können in anderen SQL-Kommandos(z.B. SELECT) verwendet werden
§ können in prozeduraler Erweiterung von SQL(z.B. Transact-SQL) oder anderer Spracheimplementiert werden
Datenbanken / Kapitel 10: Programmieren in SQL
51
Anlegen einer benutzerdefinierten Funktion§ Benutzerdefinierte Funktion lässt sich in MS SQL Server
mittels CREATE FUNCTION anlegen
§ Funktionen können skalaren Wert (z.B. vom Typ int)oder eine Tabelle (dann Rückgabewert TABLE)zurückgeben
Datenbanken / Kapitel 10: Programmieren in SQL
1 CREATE FUNCTION <Name der Funktion >2 [ @Parameter1 Typ1 = Default1 ... ]3 RETURNS Ru ckgabeTyp4 AS
5 BEGIN
6 <Folge von Transact -SQL Kommandos >7 RETURN <Wert von Ru ckgabeTyp >8 END
52
Ändern, Löschen und Anzeigen von Funktionen§ Ändern mittels ALTER FUNCTION
§ Löschen mittels DROP FUNCTION
§ Anzeigen aller Funktionen mit skalarem Rückgabewert
§ Anzeigen aller Funktionen mit Tabelle als Rückgabewert
Datenbanken / Kapitel 10: Programmieren in SQL
1 ALTER FUNCTION <Name der Funktion >
1 DROP FUNCTION <Name der Funktion >
1 SELECT * FROM sys. sysobjects WHERE type = ’FN ’
1 SELECT * FROM sys. sysobjects WHERE type = ’IF ’
53
Beispiel Funktion mit skalaren Rückgabewert§ Beispiel: Studienjahre aus gegebenem Semester
§ Funktion Studienjahre() kann nun z.B. in einem SELECT-Kommando verwendet werden
Datenbanken / Kapitel 10: Programmieren in SQL
1 DECLARE FUNCTION Studienjahre @Semester int
2 RETURNS int
3 AS
4 BEGIN
5 RETURN CEILING ( @Semester / 2) -- Aufrunden6 END
1 SELECT *2 FROM Studenten3 WHERE Studienjahre ( Semester ) > 5
54
Beispiel Funktion mit Tabelle als Rückgabewert§ Beispiel: Studenten in gegebenem Fach
Datenbanken / Kapitel 10: Programmieren in SQL
1 DECLARE FUNCTION Studenten @Fach varchar (10)2 RETURNS TABLE3 AS4 BEGIN5 RETURN ( SELECT * FROM Studenten WHERE Fach = @Fach)6 END
55
10.5 Verwendung anderer Programmiersprachen
§ Gespeicherte Prozeduren und benutzerdefinierte Funktionen lassen sich je nach RDBMS auchin anderer Programmiersprache als derjeweiligen prozeduralen Erweiterungvon SQL implementieren, z.B.
§ .NET Sprachen (C#, Visual Basic, F#) bei MS SQL Server
§ Java bei Oracle
§ Sowohl bei MS SQL Server wird Prozedur bzw. Funktion in eigener Umgebung (CLR bzw. VM) ausgeführt,um eine Abschirmung vom RDBMS selbst zuerreichen und so Abstürze zu vermeiden
Datenbanken / Kapitel 10: Programmieren in SQL
56
Verwendung anderer Programmiersprachen§ Schritte zur Implementierung einer Prozedur bzw. Funktion
in einer anderen unterstützten Programmiersprachen
§ Implementierung auf lokalem Rechner
§ Installation auf RDBMS-Server, d.h. Übertragen der Binaries
§ Registrierung im RDBMS-Server
§ Aufruf der Prozedur bzw. Funktion
Datenbanken / Kapitel 10: Programmieren in SQL
57
Beispiel UDF in C#§ Beispiel: Studienjahre aus gegebenem Semester in C#
§ Nach Installation und Registrierung bei MS SQL Server(über das SQL Server Management Studio), wird die Funktion mittels [dbo].StudienJahre() aufgerufen
Datenbanken / Kapitel 10: Programmieren in SQL
1 using Math;
2 using System ;
3 using Microsoft . SqlServer . Server ;
4
5 public static class HochschulUDFs
6 {
7 [ SqlFunction ]
8 public static int StudienJahre (int semester )
9 {
10 return (int)Math. Ceiling ( semester / 2);
11 }
12 }
58
Zusammenfassung
§ Cursor erlauben die zeilenweise Verarbeitung des Ergebnis eines SELECT-Kommandos in Transact-SQL
§ Fehlerbehandlung mittels TRY- und CATCH-Blöcken
§ Parametrisierung von gespeicherten Prozeduren mit Standardwerten und Rückgabeparameter
§ Gespeicherte Prozeduren und benutzerdefinierte Funktionen lassen sich je nach System auch inanderen Sprachen (z.B. Java) implementieren
Datenbanken / Kapitel 10: Programmieren in SQL
59
Literatur[1] A. Kemper und A. Eickler: Datenbanksysteme – Eine
Einführung, De Gruyter Oldenbourg, 2015 (Kapitel 12)
[2] G. Saake, K.-U. Sattler und A. Heuer:Datenbanken - Konzepte und Sprachen,mitp Professional, 2013 (Kapitel 13)
[3] K. Huckert: Relationale Datenbanken, htw saar, 2013