Sie sind auf Seite 1von 4

Stored procedures

25.11.2014

Stored procedures
Stored procedures (SP) ermglichen das Zusammenfassen mehrerer SQL-Befehle. Sie knnen von
einem Programm, einem anderen SQL-Befehl oder von anderen SPs aufgerufen werden.
SP sind ein wichtiger Bestandteil eines relationalen Datenbanksystems (RDBMS); MySQL untersttzt
SPs erst seit Version 5.

Vorteile

Performanceverbesserung. SPs werden von RDBMS in einem kompilierten Zustand


gespeichert. Somit laufen sie schneller als SQL-Befehle, die von einer Anwendung gestartet
werden. Dies kann bei hohem Datenaufkommen (z.B. Import Routinen) zu drastischen
Geschwindigkeitsvorteilen fhren.
SPs reduzieren den Netzwerkverkehr zwischen einer Anwendung und dem DB-Server, da sie
lediglich den Namen und ggf. Parameter an den Server senden anstatt mehrerer SQLBefehle.
Mit SPs kann Logik, die sonst in einem Programm erstellt werden muss, auf die DB
ausgelagert werden.
Sicherheit. Es kann vorkommen, dass vom DB-Administrator der Zugriff auf Daten nur ber
SPs erlaubt ist. Ein direkter Zugriff auf Tabellen ist dann nicht erlaubt.
Die Gefahr durch SQL-Injections 1 wird auf die Art ebenfalls beseitigt.

Nachteile

SPs erhhen die Serverlast bei Arbeitsspeicher und Prozessor.


Der Aufwand eine SP zu erstellen ist oftmals hher, als die gleiche Aufgabe mit
Programmlogik zu lsen.
SPs sind schwer zu debuggen.

Aufbau einer SP
DROP PROCEDURE IF EXISTS getAllFromTable1;
DELIMITER $$
CREATE PROCEDURE getAllFromTable1()
BEGIN
SELECT * FROM Table1;
END$$
DELIMITER ;

Der erste Befehl gehrt nicht zur eigentlichen SP. Er lscht eine ggf. vorhandene alte SP.
Auch der Befehl DELIMITER $$ gehrt nicht zur eigentlichen SP. SQL-Befehle werden in MySQL mit
einem Semikolon getrennt. Da in einer SP mehrere SQL-Befehle vorkommen knnen ist es ntig, den
Delimiter kurzfristig zu ndern. Hierzu nehmen wir Zeichen, die blicherweise nicht in SQL verwendet
werden. Typischerweise wird $$ oder // verwendet.

Unter SQL Injektion versteht man eine Technik, durch die ein Angreifer versucht, Ihren SQL Code als Hilfsmittel zu
benutzen, um vollkommen anderen Code auszufhren, als Sie dies beabsichtigt haben. Sie werden anfllig fr SQL Injektion,
sobald Sie Benutzereingaben direkt an Ihren SQL Code weitergeben. Diese Art von Attacken ist nicht nur auf MySQL
beschrnkt, sondern stellt fr alle RDBMS ein Problem dar.
Beispiel: Select count(*) from user where name = *loginfeld+ and passwort = [pwfeld];
Select count(*) from users where name = ich and passwort = hacker or 1 = 1 ;
Seite 1

Stored procedures

25.11.2014

Mit CREATE PROCEDURE getAllFromTable1() wird eine SP mit Namen getAllFromTable1 erstellt.
Innerhalb der Klammer knnen Parameter bergeben werden.
BEGIN und END kennzeichnen den Rumpf der SP, durch den genderten Delimiter wird das END mit
$$ abgeschlossen.
Anschlieend wird der Delimiter wieder auf Semikolon zurckgesetzt.
Der Aufruf dieser SP erfolgt mit:
CALL getAllFromTable1();

Parameter und Ablaufsteuerung einer SP


Syntax fr die Erstellung einer SP mit Parametern:
CREATE PROCEDURE spname(MODE paramname paramtyp(paramgre))
MODE kann IN, OUT oder INOUT sein, je nach Zweck des Parameters. Mehrere Parameter werden
mit Komma abgetrennt.
Hier der Aufbau einer etwas komplexeren SP:
DELIMITER $$
CREATE PROCEDURE getTable1ByID(in pID varchar(50))
BEGIN
if exists (select * from Table1 where id=pID) then
-- Nur den gewnschten zurckgeben
SELECT * FROM Table1 where id = pid;
else
-- Alles zurckgeben
SELECT * FROM Table1;
end if;
END$$
DELIMITER ;

Der Parameter pID vom aufrufenden Programm bergeben. Wenn Datenstze existieren, die der ID
entsprechen, sollen nur diese zurckgegeben werden, sonst alle.
Aufgerufen wird die SP mit CALL getTable1ByID(idbezeichnung);

Seite 2

Stored procedures

25.11.2014

Verwenden von OUT / INOUT Parametern


Diese Parameter werden verwendet, wenn keine Datenstze zurckgegeben werden sollen, sondern
nur einzelne Ergebnisse. ndern wir das obige Beispiel so, dass die Anzahl der Datenstze
zurckgegeben wird:
DELIMITER $$
CREATE PROCEDURE getTable1CountByID(OUT pCount int)
BEGIN
if exists (select * from Table1 where id=pID) then
-- Es gibt nur einen!
set pCount = 1;
else
-- Anzahl ermitteln und zurckgeben
SELECT count(*) into pCount FROM Table1;
end if;
END$$
DELIMITER ;

Wie man sieht, gibt es zwei Mglichkeiten Parameter zu fllen, mit dem SET Befehl oder als Ergebnis
einer Abfrage mit SELECT INTO.
Aufgerufen wird diese SP mit:
CALL getTable1ByID(idbezeichnung, @anzahl);
Select @anzahl;
@anzahl stellt hierbei eine Variable dar, die anschlieend ber den Select ausgegeben wird. Das @
vor dem Namen der Variablen ist hierbei zwingend!

Seite 3

Stored procedures

25.11.2014

Aufgaben: Erstellen Sie fr die worldDemo Datenbank folgende Stored Procedures


spGetCityByPopulation. Durch die Eingabe einer Zahl als Parameter sollen alle Stdte (Tabelle
city) zurckgegeben werden, deren Einwohneranzahl mindestens der eingegeben Zahl
entspricht. Zustzlich soll noch der Name des entsprechenden Landes angezeigt werden.

spGetCountryByGNP. Diese soll die Lnder zurckgeben, deren aktuelle Bruttoinlandsprodukt


(Feld GNP) kleiner ist als das vorherige (Feld GNPold). Durch die Eingabe eines Parameters
sollen die zurckgegebenen Datenstze auf einen bestimmten Kontinent beschrnkt werden
knnen. Wenn dieser Parameter leer bergeben wird, sollen die Daten aller Lnder geliefert
werden.
Ein zweiter Parameter soll als Ausgabeparameter die Anzahl der betroffenen Datenstze
zurckgeben.

spSaveCity. Dieser sollen alle Parameter bergeben werden die ntig sind, um einen
Datensatz in der Tabelle City zu erstellen bzw. zu ndern.
Wenn eine Stadt mit dem bergebenem Namen und CountryCode bereits existiert soll in
diesem Datensatz lediglich die Population gendert werden, ansonsten soll ein neuer
Datensatz eingefgt werden.
Ein weiterer Parameter soll INSERT oder UPDATE zurckgeben, je nach ausgefhrter Aktion.

Erstellen Sie fr die Fuball Datenbank folgende SPs:


Erstellen Sie die SPs saveMannschaft und saveSpieler. Dieser sollen alle Parameter
bergeben werden die ntig sind, um einen Datensatz in der Tabelle Mannschaft bzw.
Spieler zu erstellen bzw. zu ndern.
Wenn eine Mannschaft/ein Spieler mit der bergebenen ID bereits existiert soll der
Datensatz gendert werden, ansonsten soll er aktualisiert werden.

Seite 4