MySQL Stored Procedures in PhpMyAdmin
MySQL Stored Procedures sind möglich! Auf den ersten Blick wirkt MySQL mit dem PhpMyAdmin gegenüber eines Microsoft SQL Server und dessen Client Programms sehr billig. Tatsächlich hat MySQL mehr unter der Haube als angenommen. So musste ich kürzlich erst lernen, dass MySQL auch Stored Procedures unterstützt. Leider unterstützt PhpMyAdmin diese nicht. Man kann sie zwar über SQL erstellen löschen usw. jedoch gibt es keinen Menüpunkt, damit man auch übersichtlich damit arbeiten kann.
MySQL Stored Procedures anzeigen
In PhpMyAdmin gibt es leider keinen Menüpunkt der die MySQL Stored Procedures einer Datenbank anzeigt. Die einzige Mögllichkeit die uns bleibt ist eine SQL Abfrage. Dabei gibt es mehrere Dinge die uns vielleicht interessieren:
- Liste von allen Stored Procedures aller Datenbanken auf die der Benutzer Zugriff hat
SHOW PROCEDURE STATUS
- wem die Liste zu lang ist kann hier die Auswahl auf eine Datenbank begrenzen
SHOW PROCEDURE STATUS WHERE db = 'datenbankname'
- mit dem Like Operator können wir genauer suchen
SHOW PROCEDURE STATUS WHERE datenbankname LIKE '%suchstring%'
Kennt man den Namen einer Stored Procedure, so kann man sich auch dessen Create Statement anzeigen lassen. Das geht mit folgendem Statement:
SHOW CREATE PROCEDURE NameDerProcedure
Eine einfache MySQL Stored Procedure
Angenommen wir haben eine Tabelle books mit mehreren Spalten. Darunter einen Primärschlüssel (in_id), eine Spalte für den EAN Code des Buches (in_EAN) und eine Spalte die angibt, ob das Buch auf deutsch ist oder nicht (in_DE). Da unser Import jedoch nicht weiß, ob ein Buch auf deutsch ist, müssen wir diese Information aus einer anderen Spalte generieren. Wenn das 4. Zeichen im EAN Code eine 3 ist, so ist das Buch auf deutsch.
Soweit zur Theorie. Um die Spalte in_DE bei jedem Update oder Insert der Tabelle zu füllen benötigen wir eine stored procedure die bei jedem Update oder Insert automatisch aufgerufen wird. Anbei der Code für den Update:
DROP PROCEDURE IF EXISTS update_book; CREATE PROCEDURE update_book( IN p_in_EAN varchar(15), IN p_in_id int(11) ) BEGIN UPDATE books SET in_DE = if( SUBSTRING( p_in_EAN, 4, 1 ) =3, 1, 0 ) WHERE in_id = p_in_id; END
Wenn wir nun versuchen diesen Code im SQL Bereich auszuführen enden wir mit einer Fehlermeldung.
Das Problem mit dem Delimeter
Warum geht das oben genannte Beispiel nicht? Nach langem Suchen bin ich in irgend einem Forum fündig geworden. SQL Statements sind normalerweise einzeilig. Sie enden mit einem ‚;‘. Unser Statement ist viel länger und enthält ein ‚;‘ mitten im Text. Der SQL Interpreter erkennt den ‚;‘ als Zeilenende und vermisst nun das Ende des Statements (END).
Die Lösung ist hier denkbar einfach: das SQL Textfeld in PhpMySql hat ein kleines unscheinbares Textfeld am unteren Rand genannt Delimeter. Dort steht standardmäßig ‚;‘. Den müssen wir auf ein anderes Zeichen ändern und das andere Zeichen in unserem Statement einbauen (zum Beispiel ein ‚//‘). Das korrigierte Statement sieht so aus:
DROP PROCEDURE IF EXISTS update_book; // CREATE PROCEDURE update_book( IN p_in_EAN varchar(15), IN p_in_id int(11) ) BEGIN UPDATE books SET in_DE = if( SUBSTRING( p_in_EAN, 4, 1 ) =3, 1, 0 ) WHERE in_id = p_in_id; END//
Zwecks Vollständigkeit hier auch noch die Insert Stored Procedure (so legt man MySQL Stored Procedures an):
DROP PROCEDURE IF EXISTS insert_book; // CREATE PROCEDURE insert_book( IN p_in_EAN varchar(15) ) BEGIN INSERT INTO books (in_DE) VALUES ( (if( SUBSTRING( p_in_EAN, 4, 1 ) =3, 1, 0 ))); END//
Weitere Informationen kann man hier finden.
Fazit
MySQL Stored Procedures sind ein guter Weg um Logik aus einem PHP Programm in die Datenbank zu implementieren. Meistens bietet ein solches Vorgehen eine Performanceverbesserung. MySQL unterstützt Stored Procedures wie auch viele andere vor allem kommerzielle SQL Datenbanken und braucht sich nicht hinter der Konkurrenz zu verstecken.
War dieser kurze Artikel hilfreich? Wofür verwendet ihr stored procedures?
Kann ich die Datenbank auch f ür das Rechnungsprogramm von Successcontrole verwenden, oder wo liegt da der Unterschied?
Ich kenne das Rechnungsprogramm nicht, aber MySQL kann man so gut wie für alle Anwendungen einsetzen!