10. Programmieren in SQL
Inhalt 10.1 Motivation 10.2 Prozedurale Erweiterungen von SQL 10.3 Gespeicherte Prozeduren 10.4 Benutzerdefinierte Funktionen 10.5 Verwendung anderer Programmiersprachen 2
10.1 Motivation SQL als interaktive Anfragesprache für menschliche Benutzer oder Anwendungsprogramme entworfen Komplexe Operationen lassen sich nicht (leicht) in einem einzelnen SQL-Kommando ausdrücken, so dass sie in mehrere Kommandos zerlegt und deren Ablauf durch ein Anwendungsprogramm gesteuert werden muss Kapitel 11 behandelt die Implementierung solcher Anwendungsprogramme (z.b. in Java oder C), die von außen auf die Datenbank zugreifen 3
Motivation Erweiterung von SQL um prozedurale Sprachelemente (z.b. Bedingungen und Schleifen) zur Implementierung gespeicherter Prozeduren (stored procedures) und benutzerdefinierter Funktionen (user-defined functions) zur Implementierung komplexer Operationen im RDBMS Gespeicherte Prozeduren erlauben, neben den Daten, auch Funktionalität der modellierten Anwendung (business logic) redundanzfrei und zentral im RDBMS abzubilden 4
Motivation Vorteile gespeicherter Prozeduren gegenüber einer Implementierung in Anwendungsprogramm sind u.a. Kapselung und zentrale Bereitstellung von Funktionalität (business logic) im RDBMS Ausführung direkt im RDBMS und damit häufig auf leistungsstarker Server-Hardware Reduzierung der Netzwerklast, da Daten nicht zum Client transferiert werden müssen Automatische Optimierung durch den Anfrageoptimierer des RDBMS möglich 5
Gespeicherte Prozeduren Gespeicherte Prozeduren (stored procedures) können einen Rückgabewert haben ändern meist die gespeicherten Daten typische Anwendung ist die Stapelverarbeitung, d.h. die Prozedur kapselt eine Folge nacheinander auszuführender Kommandos Implementierung in prozeduraler Erweiterung von SQL (z.b. Transact-SQL bei MS SQL Server) oder anderer Programmiersprache nicht in anderen SQL-Kommandos verwendbar 6
Gespeicherte Prozeduren Beispiel: Bereinigung Hochschuldaten zu Semesterbeginn Erhöhe das Semester aller Studenten um 1 Lösche Studenten, deren Semester danach größer als 30 ist; ihre Einträge in hören sollen mittels eines geeigneten FOREIGN KEY Constraints entfernt werden Lösche Vorlesungen, die von keinem Studenten gehört werden und die kein Professor liest 7
Benutzerdefinierte Funktionen Benutzerdefinierte Funktionen (user-defined functions) berechnen einen Rückgabewert ändern die gespeicherten Daten nicht typische Anwendung ist das Bereitstellen von Funktionalität, die das RDBMS nicht mitbringt (z.b. statistische Funktionen, Umwandlung von Zeichenketten), welche wiederverwendet werden kann Implementierung in prozeduraler Erweiterung von SQL (z.b. Transact-SQL) oder anderer Programmiersprache in anderen SQL-Kommandos verwendbar 8
Benutzerdefinierte Funktionen Beispiele in Hochschulanwendung: Abkürzung von Vorlesungstiteln mittels Ersetzungsregeln Einführung wird zu Einf. in die wird zu i.d. Grundlagen wird zu Grdl. Eingabe ist Vorlesungstitel; Ausgabe ist seine Abkürzung Berechnung eines gewichteten Notendurchschnitts unter Berücksichtigung der Semesterzahl Prüfungsergebnisse sollen mit SWS gewichtet werden -0.3 Abzug je Semester unter Regelstudienzeit Eingabe ist Matrikelnummer; Ausgabe ist Notendurchschnitt 9
10.2 Prozedurale Erweiterungen von SQL Erweiterung von SQL um prozedurale Sprachelemente (z.b. Bedingungen und Schleifen) SQL/PSM als Bestandteil des SQL-Standards (seit 1996) PL/SQL bei Oracle SQL PL bei IBM PL/pgSQL bei PostgreSQL Transact-SQL bei Microsoft Systemspezifische Sprachen vor Standard entstanden; zunehmenden Unterstützung des SQL/PSM-Standards 10
Transact-SQL Wir betrachten Transact-SQL als prozedurale Erweiterung von SQL in Microsoft SQL Server etwas genauer Transact-SQL erweitert SQL um folgende Konzepte Meldungen/Ausgaben an den Benutzer lokale und globale Variablen Bedingungen Kommentare Datentypen Schleifen Cursor 11
Kommentare Transact-SQL kennt zwei Arten von Kommentaren Zeilenkommentar (--) 1 -- Diese Zeile wird bei der Ausführung ignoriert Blockkommentar (/*... */) 1 /* 2 * 3 * Alle Zeilen werden bei der Ausführung ignoriert 4 * 5 */ 12
Stapelverarbeitung Stapelverarbeitung als einfache Anwendung, d.h. es wird eine Folge von SQL-Kommandos ausgeführt 1 -- Tabelle Vorlesungen anlegen 2 CREATE TABLE Vorlesungen ( 3 VorlNr int NOT NULL, 4 Titel varchar(30) NOT NULL, 5 SWS int NOT NULL, 6 ProfNr int, 7 PRIMARY KEY(VorlNr) 8 ) 9 10 -- Vorlesungen einfügen 11 INSERT INTO Vorlesungen (VorlNr, Titel, SWS, ProfNr) 12 VALUES (1, Datenbanken, 4, NULL) 13 INSERT INTO Vorlesungen (VorlNr, Titel, SWS, ProfNr) 14 VALUES (2, Programmierung, 4, NULL) 13
Datentypen Transact-SQL unterstützt von SQL bekannte Datentypen bigint (8 Bytes) und int (4 Bytes) für ganze Zahlen float und real für Gleitkommazahlen money (4 Nachkommastellen) char(n) als Zeichenkette fester Länge varchar(n) als Zeichenkette variabler Länge 14
Variablen Transact-SQL unterscheidet lokale und globale Variablen Globale Variablen werden vom System bereitgestellt und sind am Präfix @@ im Namen zu erkennen, z.b. @@SERVERNAME liefert Name des Servers @@VERSION liefert Version des Servers @@ERROR liefert Ausführungscode der letzten Anweisung @@ROWCOUNT als Anzahl von Zeilen, welche die letzte Anweisung erzeugt hat 15
Variablen Lokale Variablen müssen deklariert werden und sind am Präfix @ im Namen zu erkennen Deklaration lokaler Variable mittels DECLARE 1 DECLARE @Variable1 Typ1, @Variable2 Typ2,... Lokale Variablen haben initial den Wert NULL Wertzuweisung an lokale Variable mit SET oder SELECT 1 SET @Variable1=Wert1 2 SELECT @Variable1=Wert1 16
Variablen Beispiel: Deklaration von drei Variablen @a, @b und @c vom Typ int, gefolgt von Wertzuweisung 1 DECLARE @a int, @b int, @c int 2 SET @a=1 3 SET @b=2 4 SET @c=@a+@b 17
Variablen Variable kann Ergebnis eines SELECT-Kommandos als Wert zugewiesen werden, sofern dies aus einem einzigen Wert besteht Beispiel: 1 DECLARE @anzahl_studenten int 2 SET @anzahl_studenten = 3 ( SELECT COUNT(*) FROM Studenten) 18
Meldungen Meldungen, z.b. zum Generieren von Berichten, können mittels PRINT an den Benutzer ausgegeben werden 1 PRINT Hello World Zeichenketten können mittels + konkateniert werden; Variablen anderen Typs müssen mittels CAST in eine Zeichenkette umgewandelt werden 1 DECLARE @num int 2 SET @num = 13 3 PRINT Hello User + CAST(@num AS varchar) +! 19
Anweisungsblöcke Block von Anweisungen mit BEGIN... END definierbar 1 BEGIN 2 UPDATE Studenten SET Semester = Semester + 1 3 DELETE FROM Studenten WHERE Semester > 30 4 END Strichpunkt zum Trennen der Anweisungen verwendbar Verwendung als Teil von Bedingungen und Schleifen 20
Bedingungen Transact-SQL stellt mit IF... ELSE ein Kommando zur bedingten Ausführung von Anweisungsblöcken bereit 1 IF <Bedingung> 2 <Anweisung oder Anweisungsblock> 3 ELSE 4 <Anweisung oder Anweisungsblock> Beispiel: 1 IF EXISTS ( SELECT * FROM Professoren WHERE Name = Simpson ) 2 BEGIN 3 PRINT Es gibt einen Professor namens Simpson 4 PRINT Ob sein Vorname Homer ist? 5 END 6 ELSE 7 PRINT Es gibt keinen Professor namens Simpson 21
Konditionale Transact-SQL unterstützt mittels des CASE Kommandos bedingte Ausdrücke, sogenannte Konditionale 1 CASE <Variable> 2 WHEN <Wert1> THEN <Rückgabe1> 3 WHEN <Wert2> THEN <Rückgabe2> 4 END Konditional wertet zu einem Rückgabewert aus und dient, im Gegensatz zu IF... ELSE, nicht zur Ablaufsteuerung 22
Schleifen Transact-SQL verfügt mit WHILE über ein Kommando zur wiederholten Ausführung eines Anweisungsblocks 1 WHILE <Bedingung> 2 <Anweisung oder Anweisungsblock> Zusätzlich kann die Schleife mit dem Kommando BREAK beendet werden; mit dem Kommando CONTINUE wird ein neuer Schleifendurchlauf gestartet 23
Schleifen Beispiel: Gebe Zahlen von 1 bis 10 aus 1 DECLARE @i int 2 SET @i = 1 3 WHILE @i <= 10 4 BEGIN 5 PRINT CAST(@i AS VARCHAR) 6 7 PRINT CASE @i 8 WHEN 1 THEN ist die erste Zahl 9 WHEN 10 THEN ist die letzte Zahl 10 END 11 12 SET @i = @i + 1 13 END 24
Dynamische Befehlsausführung Transact-SQL erlaubt mittels des Kommandos EXECUTE das Aufrufen einer gespeicherten Prozedur bzw. das Ausführen eines als Zeichenkette hinterlegten Kommandos 1 DECLARE @order varchar(30) 2 DECLARE @command varchar(100) 3 4 SET @order = DESC 5 SET @command SELECT * FROM Kunden ORDER BY Name + @order 6 7 EXECUTE(@command) 25
Zusammenfassung Gespeicherte Prozeduren und benutzerdefinierte Funktionen erlauben die Kapselung von Funktionalität, welche direkt auf RDBMS-Server ausgeführt wird und dadurch Ressourcen spart Implementierung in prozeduralen Erweiterungen von SQL (z.b. Transact-SQL bei SQL Server) oder anderen Programmiersprachen Transact-SQL erweitert SQL z.b. um Variablen, Meldungen, Schleifen und Bedingungen 26
Literatur [1] A. Kemper und A. Eickler: Datenbanksysteme Eine Einführung, De Gruyter Oldenbourg, 2013 (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 http://www1.htwsaar.de/~braun/uebungen/datenbanken/ (Kapitel 8) 27
Rückblick Gespeicherte Prozeduren und benutzerdefinierte Funktionen erlauben die Kapselung von Funktionalität, welche direkt auf RDBMS-Server ausgeführt wird und dadurch Ressourcen spart Implementierung in prozeduralen Erweiterungen von SQL (z.b. Transact-SQL bei SQL Server) oder anderen Programmiersprachen Transact-SQL erweitert SQL z.b. um Variablen, Meldungen, Schleifen und Bedingungen 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 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ührung der gewünschten Operationen 4. Schließen des Cursors 5. Löschen der Definition des Cursors 30
Definition eines Cursors Bei Definition eines Cursors ist festzulegen, ob er nur lesend oder auch schreibend auf das Ergebnis zugreift sich nur vorwärts oder auch rückwärts durch das Ergebnis bewegen kann zwischenzeitliche Datenänderungen im Ergebnis sehen soll 31
Definition eines Cursors Definition eines Cursors mittels DECLARE-Kommando 1 DECLARE <Name des Cursors> CURSOR 2 [ FORWARD_ONLY SCROLL] 3 [ STATIC KEYSET DYNAMIC FAST_FORWARD] 4 [ READ_ONLY SCROLL_LOCKS OPTIMISTIC] 5 FOR < SELECT Statement > Ob der Cursor nur lesend oder auch schreibend zugreift READ_ONLY : nur lesend SCROLL_LOCKS : schreibend mit Sperren OPTIMISTIC : schreibend ohne Sperren 32
Definition eines Cursors Definition eines Cursors mittels DECLARE-Kommando 1 DECLARE <Name des Cursors> CURSOR 2 [ FORWARD_ONLY SCROLL] 3 [ STATIC KEYSET DYNAMIC FAST_FORWARD] 4 [ READ_ONLY SCROLL_LOCKS OPTIMISTIC] 5 FOR < SELECT Statement > Ob sich Cursor nur vorwärts oder auch rückwärts bewegt FORWARD_ONLY : nur vorwärts SCROLL : vorwärts und rückwärts 33
Definition eines Cursors Definition eines Cursors mittels DECLARE-Kommando 1 DECLARE <Name des Cursors> CURSOR 2 [ FORWARD_ONLY SCROLL] 3 [ STATIC KEYSET DYNAMIC FAST_FORWARD] 4 [ READ_ONLY SCROLL_LOCKS OPTIMISTIC] 5 FOR < SELECT Statement > Ob der Cursor zwischenzeitliche Datenänderung sieht STATIC : es wird initial Kopie des Ergebnis erzeugt KEYSET : Kopie der Schlüssel, andere Attribute nachgelesen DYNAMIC : Änderungen ab aktueller Zeile sichtbar FAST_FORWARD : schreibgeschützt, nur in eine Richtung 34
Öffnen und Bewegen eines Cursors Öffnen eines Cursors mittels OPEN-Kommando 1 OPEN <Name des Cursors> Bewegen des Cursors erfolgt mittels FETCH-Kommandos 1 FETCH 2 [ NEXT PRIOR FIRST LAST ABSOLUTE n RELATIVE n] 3 FROM <Name des Cursors> 4 INTO <lokale Variable> 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 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. die Bewegung des Cursors zu steuern Werte der Variable @@FETCH_STATUS 0 : alles in Ordnung -1 : Operation außerhalb des Cursors -2 : Zeile nicht vorhanden 36
Schließen und Entfernen eines Cursors Schließen eines Cursors mittels CLOSE-Kommando 1 CLOSE <Name des Cursors> Entfernen eines Cursors mittels DEALLOCATE-Kommando 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 1 -- Cursor und lokale Variablen deklarieren 2 DECLARE StudentenCursor CURSOR FAST_FORWARD 3 FOR SELECT Vorname, Name FROM Studenten WHERE Semester > 10 4 5 DECLARE @StudentenVorname varchar(30), @StudentenName varchar(30) 6 7 -- Zeilenweise Verarbeitung 8 OPEN StudentenCursor 9 FETCH NEXT FROM StudentenCursor INTO @StudentenVorname, @StudentenName 10 WHILE(@@FETCH_STATUS = 0) 11 BEGIN 12 PRINT Vorname: + @StudentenVorname 13 PRINT Name: + @StudentenName 14 FETCH NEXT FROM StudentenCursor INTO @StudentenVorname, @StudentenName 15 END 16 17 -- Cursor schließen und entfernen 18 CLOSE StudentenCursor 19 DEALLOCATE StudentenCursor 38
Fehlerbehandlung Die globale Variable @@ERROR zeigt an, ob das letzte Transact-SQL-Kommando erfolgreich ausgeführt wurde; der Wert wird nach jedem Kommando neu zugewiesen Werte der Variable @@ERROR 0 : Kommando wurde erfolgreich ausgeführt > 0 : Kommando wurde nicht erfolgreich ausgeführt Im Fehlerfall verweist der Rückgabewert auf einen Eintrag in der Systemtabelle sys.messages, die genauere Informationen zum Fehler enthält 39
Beispiel Fehlerbehandlung Beispiel: Division durch 0 1 PRINT 1/0 -- gibt Wert 8134 zurück 1 SELECT * 2 FROM sys.messages 3 WHERE message_id = 8134 4 AND language_id = 1031 message id language severity is event logged text 8134 1031 16 false Fehler aufgrund Division durch Null 40
Fehlerschwere Transact-SQL unterscheidet verschiedene Schweren (severity) von Fehler; eine Schwere höher als 10 führt zum Abbruch des Programms bzw. Sprung in CATCH-Block Schwere von Fehler (severity in sys.messages) 0-10 : Informationsmeldungen 11-16 : Fehlerhaftes Programm (z.b. falsche Syntax) 17 : Mangelnde Ressourcen (z.b. Speicher) 18 : Problem im MS SQL Server 19 : Schwerer interner Fehler 20-25 : Fataler Fehler 41
Fehlerbehandlung Transact-SQL verfügt, ähnlich Java, mit den Kommandos TRY und CATCH über einen Möglichkeit, Fehlern systematisch zu begegnen 1 BEGIN TRY Läuft der TRY-Block 2 <Transact-SQL Kommandos> 3 END TRY 4 BEGIN CATCH 5 <Transact-SQL Kommandos> 6 END CATCH ohne Fehler (0-10) ab, wird CATCH-Block nicht ausgeführt mit Fehler (11-16) ab, wird CATCH-Block ausgeführt mit fatalem Fehler (> 17) ab, wird Programm abgebrochen 42
Fehlerbehandlung Innerhalb eines CATCH-Blocks stehen folgende Funktionen zur Verfügung, um mehr über den Fehler zu erfahren ERROR_LINE() gibt Zeile an, in der Fehler auftrat ERROR_MESSAGE() gibt Fehlermeldung aus ERROR_NUMER() gibt Fehlercode aus ERROR_SEVERITY() gibt Schwere des Fehlers aus ERROR_STATE() gibt Status zurück 43
Beispiel Fehlerbehandlung Beispiel: Anfrage mit ungültigem Attributnamen gibt aus 1 BEGIN TRY 2 SELECT * 1 ErrorCode: 207 3 FROM Studenten 4 WHERE ProfNr = 42 5 END TRY 6 BEGIN CATCH 7 PRINT @@ERROR 8 PRINT ERROR_MESSAGE() 9 END CATCH 2 Error: Ungültiger Spaltenname ProfNr. 44
10.3 Gespeicherte Prozeduren Gespeicherte Prozeduren (stored procedures) kapseln Funktionalität (business logic) zentral im RDBMS können einen Rückgabewert haben dürfen die gespeicherte Daten ändern können nicht in anderen SQL-Kommandos (z.b. SELECT) verwendet werden können in prozeduraler Erweiterung von SQL (z.b. Transact-SQL) oder anderer Sprache implementiert werden 45
Anlegen einer gespeicherten Prozedur Gespeicherte Prozedur lässt sich in MS SQL Server anlegen mittels CREATE PROCEDURE 1 CREATE PROCEDURE <Name der Prozedur> 2 [@Parameter1 Typ1 = Default1... ] 3 [@ParameterN TypN = DefaultN OUTPUT] 4 AS 5 <Folge von Transact-SQL Kommandos> Beispiel: Löschen aller Datensätze in Tabelle hören 1 CREATE PROCEDURE HörenLöschen 2 @Anzahl int = 0 OUTPUT 3 AS 4 DELETE FROM hören 5 SET @Anzahl = @@ROWCOUNT 46
Ändern, Löschen und Anzeigen von Prozeduren Ändern mittels ALTER PROCEDURE 1 ALTER PROCEDURE <Name der Prozedur> Löschen mittels DROP PROCEDURE 1 DROP PROCEDURE <Name der Prozedur> Anzeigen aller gespeicherten Prozeduren 1 SELECT * 2 FROM sys.sysobjects 3 WHERE type = p 47
Parametrisierung Gespeicherte Prozeduren können mehrere Parameter als Eingabe und einen Parameter als Ausgabe haben Parameter können mit Vorgabewert belegt werden; dieser wird verwendet, wenn kein Wert angegeben wird Beispiel: Erhöhung des Semesters eines Studenten 1 CREATE PROCEDURE SemesterErhöhen @MatrNr int, @Erhöhung int = 1 2 AS 3 UPDATE Studenten 4 SET Semester = Semester + @Erhöhung 5 WHERE MatrNr = @MatrNr 1 EXECUTE SemesterErhöhen 328762 -- führt Erhöhung um 1 durch 2 EXECUTE SemesterErhöhen 328762, 2 -- führt Erhöhung um 2 durch 48
Festlegen des Rückgabewerts Rückgabewert einer gespeicherten Prozedur wird mit OUTPUT unter den Parametern festgelegt Endet die Ausführung der Prozedur, wird der aktuelle Wert des mit OUTPUT markierten Parameters zurückgegeben Mittels RETURN kann die Ausführung der Prozedur beendet und ein Wert zurückgegeben werden; auch ohne Wert kann so die Prozedur beendet werden 49
Festlegen des Rückgabewerts Beispiel: Ermittle Zahl der Studenten in einem Semester Variante 1 mit OUTPUT Parameter 1 CREATE PROCEDURE StudentenAnzahl 2 @Semester int 3 @Anzahl int OUTPUT 4 AS 5 SET @Anzahl = (SELECT COUNT(*) FROM Studenten WHERE Semester = @Semester) Variante 2 mit RETURN 1 CREATE PROCEDURE StudentenAnzahl 2 @Semester int 3 AS 4 DECLARE @Anzahl int 5 SET @Anzahl = (SELECT COUNT(*) FROM Studenten WHERE Semester = @Semester) 6 RETURN @Anzahl 50
10.4 Benutzerdefinierte Funktionen Benutzerdefinierte Funktionen (user-defined functions) berechnen einen Rückgabewert dürfen die gespeicherten Daten nicht ändern können in anderen SQL-Kommandos (z.b. SELECT) verwendet werden können in prozeduraler Erweiterung von SQL (z.b. Transact-SQL) oder anderer Sprache implementiert werden 51
Anlegen einer benutzerdefinierten Funktion Benutzerdefinierte Funktion lässt sich in MS SQL Server mittels CREATE FUNCTION anlegen 1 CREATE FUNCTION <Name der Funktion> 2 [@Parameter1 Typ1 = Default1... ] 3 RETURNS RückgabeTyp 4 AS 5 BEGIN 6 <Folge von Transact-SQL Kommandos> 7 RETURN <Wert von RückgabeTyp> 8 END Funktionen können skalaren Wert (z.b. vom Typ int) oder eine Tabelle (dann Rückgabewert TABLE) zurückgeben 52
Ändern, Löschen und Anzeigen von Funktionen Ändern mittels ALTER FUNCTION 1 ALTER FUNCTION <Name der Funktion> Löschen mittels ALTER FUNCTION 1 DROP FUNCTION <Name der Funktion> Anzeigen aller Funktionen mit skalarem Rückgabewert 1 SELECT * FROM sys.sysobjects WHERE type = FN Anzeigen aller Funktionen mit Tabelle als Rückgabewert 1 SELECT * FROM sys.sysobjects WHERE type = IF 53
Beispiel Funktion mit skalaren Rückgabewert Beispiel: Studienjahre aus gegebenem Semester 1 DECLARE FUNCTION Studienjahre @Semester int 2 RETURNS int 3 AS 4 BEGIN 5 RETURN CEILING(@Semester / 2) -- Aufrunden 6 END Funktion Studienjahre() kann nun z.b. in einem SELECT-Kommando verwendet werden 1 SELECT * 2 FROM Studenten 3 WHERE Studienjahre(Semester) > 5 54
Beispiel Funktion mit Tabelle als Rückgabewert Beispiel: Studenten in gegebenem Fach 1 DECLARE FUNCTION Studenten @Fach varchar(10) 2 RETURNS TABLE 3 AS 4 BEGIN 5 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 auch in anderer Programmiersprache als der jeweiligen prozeduralen Erweiterung von 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 zu erreichen und so Abstürze zu vermeiden 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 57
Beispiel UDF in C# Beispiel: Studienjahre aus gegebenem Semester in C# 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 } Nach Installation und Registrierung bei MS SQL Server (über das SQL Server Management Studio), wird die Funktion mittels [dbo].studienjahre() aufgerufen 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 in anderen Sprachen (z.b..net oder Java) implementieren 59
Literatur [1] A. Kemper und A. Eickler: Datenbanksysteme Eine Einführung, De Gruyter Oldenbourg, 2013 (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 http://www1.htwsaar.de/~braun/uebungen/datenbanken/ (Kapitel 8) 60