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 Wertzuweisungen 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 Prozedurale Erweiterungen von SQL erlauben die Implementierung komplexer Operationen (business logic) innerhalb des RDBMs Syntax der Erweiterungen ist stark systemabhängig; Transact-SQL als Sprache von MS SQL Server Gespeicherte Prozeduren (z.b. zur Stapelverarbeitung) und benutzerdefinierte Funktionen (z.b. zur Erweiterung des Funktionsumfangs des RDBMS) 26
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 http://www1.htwsaar.de/~braun/uebungen/datenbanken/ (Kapitel 8) 27