MySQL bietet, wie andere Datenbanksysteme, die Funktionalität von sog. Stored Procedures oder auch Stored Routines genannt. Unter einer Stored Procedures versteht man das Ablegen einer eigenen Prozedur direkt in der Datenbank selbst. Die eigene Prozedure lässt sich über SQL ansprechen und ausführen. Man kann innerhalb der Prozedur im Grunde alle bekannten SQL Befehle nutzen und man kann sogar Parameter an die Stored Procedures übergben.
Damit die ganze Anleitung etwas griffiger wird, nehmen wir in diesem Beispiel zur Grundlage eine Tabelle products. Hierfür erstellen wir zunächst die Tabelle mit ein paar Testdatensätzen:
CREATE TABLE IF NOT EXISTS `product` ( `id` int(10) NOT NULL AUTO_INCREMENT, `user_id` int(10) DEFAULT NULL, `short_desc` varchar(50) DEFAULT NULL, `created` timestamp NULL DEFAULT CURRENT_TIMESTAMP, `modified` timestamp NULL DEFAULT NULL, `deleted` timestamp NULL DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8; INSERT INTO `product` (`id`, `user_id`, `short_desc`, `created`, `modified`, `deleted`) VALUES (1, 10, 'test product', '2013-12-06 18:40:29', '2013-12-11 09:15:36', NULL), (2, 20, 'special product', '2013-12-10 23:32:53', '2013-12-11 09:15:18', NULL), (3, 23, 'new product', '2013-12-11 09:14:48', '2013-12-11 09:15:05', NULL); |
Nun erstellen wir die Strored Procedure mit einem einfachen SELECT Statement
CREATE DEFINER=`root`@`localhost` PROCEDURE `get_all_products`() LANGUAGE SQL NOT DETERMINISTIC CONTAINS SQL SQL SECURITY DEFINER COMMENT 'get all products from table' BEGIN SELECT * FROM product; END |
Wenn das alles geklappt hat, kann man nun die eigene Strored Procedure mit dem Befehl CALL aufrufen:
CALL `get_all_products`(); |
Und erhält man, wie im Select Statement angegeben, alle Spalten der Tabelle products:
Soweit so gut, jetzt erweitern wir das Beispiel ein wenig und übergeben die ID eines gewünschten Produktes an das Select Statement innerhalb der Strored Procedure. Hierfür erstellen wir eine weitere Strored Procedure get_all_products_by_id mit dem folgenden Create Statement
CREATE DEFINER=`root`@`localhost` PROCEDURE `get_all_products_by_id`(IN ` prod_id ` INT) LANGUAGE SQL NOT DETERMINISTIC CONTAINS SQL SQL SECURITY DEFINER COMMENT 'get all products from table by id' BEGIN SELECT * FROM product WHERE prod_id=id; END |
Wenndas wiederum geklappt hat, kann man nun die eigene Strored Procedure wieder mit dem Befehl CALL aufrufen und die gewünschte ID des Produktes übergben:
CALL `get_all_products`(2); |
Und man erhält das Ergebnis: