10. Programmieren in SQL

Ähnliche Dokumente
Prozedurale Datenbank- Anwendungsprogrammierung

Semantische Integrität (auch: Konsistenz) der in einer Datenbank gespeicherten Daten als wichtige Anforderung

SQL. SQL: Structured Query Language. Früherer Name: SEQUEL. Standardisierte Anfragesprache für relationale DBMS: SQL-89, SQL-92, SQL-99

Dynamisches SQL. Folien zum Datenbankpraktikum Wintersemester 2009/10 LMU München

Objektrelationale und erweiterbare Datenbanksysteme

Explizite Cursor. Cursor. Steuerung des expliziten Cursors. Explizite Cursor Funktionen

Dipl. Inf. Dipl. Math. Y. Orkunoglu Datum:

DATENBANKEN SQL UND SQLITE VON MELANIE SCHLIEBENER

Entwicklungsumgebung für die Laborübung

4. Structured Query Language (SQL)

ISU 1. Ue_08/02_Datenbanken/SQL. 08 Datenbanken. Übung. SQL Einführung. Eckbert Jankowski.

PL/pgSQL. VU Datenbanksysteme. Reinhard Pichler

Datenbanken SQL Einführung Datenbank in MySQL einrichten mit PhpMyAdmin

Microsoft SQL-Server Enterprise-Manager

Hochschule Karlsruhe Technik und Wirtschaft Anhänge: Fakultät für Informatik und Wirtschaftsinformatik SS 2013 Prof. Schmidt.

Dynamische Ausführung/ Dynamic Execution. Cursors

Prozedurale SQL-Erweiterungen

Kapitel 33. Der xml-datentyp. In diesem Kapitel: Der xml-datentyp 996 Abfragen aus xml-datentypen 1001 XML-Indizierung 1017 Zusammenfassung 1023

5.8 Bibliotheken für PostgreSQL

Structured Query Language (SQL) als standardisierte Anfragesprache für relationale Datenbanken

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";

Rückblick: Datenbankentwurf

JavaScript. Dies ist normales HTML. Hallo Welt! Dies ist JavaScript. Wieder normales HTML.

7. Datenbank-Zugriff. Vorlesung und Übung Dr. Peter Pfahler Institut für Informatik Universität Paderborn. Zum Beispiel aus PHP-Skripten: Client 7-2

Vorbereitungen zum 3. Praktikum (PL/SQL):

SQL structured query language

Inhalt. Ein Einführung in die Nutzung von SQL-Datenbanken am Beispiel Oracle. Daten und Tabellen - ein Beispiel. Daten und Tabellen - Normalisierung

11 Anwendungsprogrammierung

Datumsangaben, enthält mindestens Jahr, Monat, Tag

Powerful PL/SQL: Collections indizieren mit VARCHAR2- Indizes ein Praxisbeispiel

WS 2010/11 Datenbanksysteme Fr 15:15 16:45 R Vorlesung #6. SQL (Teil 4)

SQL Tutorial. SQL - Tutorial SS 06. Hubert Baumgartner. INSO - Industrial Software

Datenbankprogrammierung 1

PostgreSQL unter Debian Linux

Vorwort 11. Eine neue Datenbank erstellen 79;

Datenbanksysteme I Datenbankprogrammierung Felix Naumann

Fachhochschule Kaiserslautern Labor Datenbanken mit MySQL SS2006 Versuch 1

Datenbanken 1 und Objektorientierte Datenbanken

Whitepaper. Produkt: combit Relationship Manager. Datensatzhistorie mit dem SQL Server 2000 und combit GmbH Untere Laube Konstanz

7. Datenbank-Zugriff. Vorlesung und Übung Dr. Peter Pfahler Institut für Informatik Universität Paderborn. Zum Beispiel aus PHP-Skripten: Client 7-2

Datenbanksysteme Kapitel 7: SQL. Oliver Vornberger. Institut für Informatik Universität Osnabrück

Datenbanksysteme Kapitel 7: SQL. Oliver Vornberger. Institut für Informatik Universität Osnabrück

Einführung in den Einsatz von Objekt-Orientierung mit C++ I

Datenbanksysteme. Dominic Pacher. Datenbanken und Informationssysteme (DBIS) Institut für Informatik Universität Innsbruck. dbis-informatik.uibk.ac.

Welche Informatik-Kenntnisse bringen Sie mit?

Referentielle Integrität

MySQL-Befehle. In diesem Tutorial möchte ich eine kurze Übersicht der wichtigsten Befehle von MySQL geben.

11 Funktionen Vorteile von Funktionen. Leseprobe aus Access und SQL Server

Java 8. Elmar Fuchs Grundlagen Programmierung. 1. Ausgabe, Oktober 2014 JAV8

Übung Datenbanken in der Praxis. Datenmodifikation mit SQL

2. Datenbank-Programmierung

Inhaltsverzeichnis. jetzt lerne ich

Views in SQL. 2 Anlegen und Verwenden von Views 2

Einstieg in das SQL- und Datenbanktuning Loblied auf den Tabellen-Index!

Mengenvergleiche: Alle Konten außer das, mit dem größten Saldo.

SQL (Structured Query Language) Schemata Datentypen

Strukturierte Objekttypen

RO-Tutorien 3 / 6 / 12

Java Einführung Methoden. Kapitel 6

Datenbanksysteme 2015

WS 2010/11 Datenbanksysteme Fr 15:15 16:45 R Vorlesung #5. SQL (Teil 3)

Referentielle Integrität

Übungsblatt 8- Lösungsvorschlag

Kapitel 5 Dr. Jérôme Kunegis. SQL: Grundlagen. WeST Institut für Web Science & Technologien

Einführung in PL/SQL

SQL für Trolle. mag.e. Dienstag, Qt-Seminar

Relationales Modell: SQL-DDL. SQL als Definitionssprache. 7. Datenbankdefinitionssprachen. Anforderungen an eine relationale DDL

PHP und MySQL. Integration von MySQL in PHP. Zellescher Weg 12 Willers-Bau A109 Tel Michael Kluge (michael.kluge@tu-dresden.

JDBC. Es kann z.b. eine ODBC-Treiberverbindung eingerichtet werden, damit das JAVA-Programm auf eine ACCESS-DB zugreifen kann.

Datenbanken SQL. Insert, Update, Delete, Drop. Krebs

desk.modul : WaWi- Export

NoSQL mit Postgres 15. Juni 2015

SQLJ. Standardisierte Java-DB. DB-Schnittstelle. Spezifikationen. Oracle, IBM, Informix, Sybase,, Tandem, Sun, Microsoft stehen dahinter

zu große Programme (Bildschirmseite!) zerlegen in (weitgehend) unabhängige Einheiten: Unterprogramme

cs241: Datenbanken mit Übungen HS 2011

16 SQL Server-Zugriff per VBA

Inhalt: 1. Einleitung... S Stored Procedures... S Stored Functions... S Procedures ändern und anzeigen lassen... S. 5 5.

Einstieg in die Informatik mit Java

VO Datenmodellierung. Katrin Seyr

zu große Programme (Bildschirmseite!) zerlegen in (weitgehend) unabhängige Einheiten: Unterprogramme

Rückblick: Entity-Relationship-Modell

Inhaltsverzeichnis. 1 Der SQL Server 2008 stellt sich vor Die grafischen Tools des SQL Server Eine neue Datenbank erstellen 87

ACCESS SQL ACCESS SQL

vs. Fehler zur Übersetzungszeit

Datenbanksysteme 2011

Datenbanken: Prozedurales SQL

Aktivitäten in C# /.NET umsetzen

Datenbanken. Datenintegrität + Datenschutz. Tobias Galliat. Sommersemester 2012

Klausur PI Datenbanken II vom Name: Praktische Informatik (Krägeloh)

Cassandra Query Language (CQL)

Kapitel DB:VI (Fortsetzung)

SQL und MySQL. Kristian Köhntopp

SQL-Befehlsliste. Vereinbarung über die Schreibweise

Informatik. Studiengang Chemische Technologie. Michael Roth WS 2012/2013. Hochschule Darmstadt -Fachbereich Informatik-

Datenbanken (WS 2015/2016)

Objektrelationale Datenbanken

Datenintegrität. Einschränkung der möglichen Datenbankzustände und -übergänge auf die in der Realität möglichen

Objektorientierte Programmierung

Vorlesung Programmieren

Transkript:

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