[MySQL] Kleines Beispiel zu Stored Procedures unter MySQL 5

Thomas Darimont

Erfahrenes Mitglied
Hallo!

Hier mal ein kleines Beispiel dazu wie man unter MySQL 5 mit Stored Procedures
arbeiten kann. In diesem Fall haben wir eine Stored Procedure die Zeilenweise
für das Ergebnis einer Abfrage mit den Werten der aktuellen Ergebniszeile eine
andere StoredProcedure aufruft.

Wir erzeugen eine Beispieltabelle mit ein paar Daten.
SQL:
mysql> create table bubu(id int not null auto_increment, value varchar(32), primary key(id));
Query OK, 0 rows affected (0.06 sec)

mysql> insert into bubu (value) values ('A');
Query OK, 1 row affected (0.03 sec)

mysql> insert into bubu (value) values ('B');
Query OK, 1 row affected (0.03 sec)

mysql> insert into bubu (value) values ('C');
Query OK, 1 row affected (0.03 sec)

mysql> select * from bubu;
+----+-------+
| id | value |
+----+-------+
|  1 | A     |
|  2 | B     |
|  3 | C     |
+----+-------+
3 rows in set (0.00 sec)

Hier setzen wir einen "DELIMITER" String.
SQL:
mysql> delimiter //

Wir definieren unsere Stored Procedure welche wir für jede Ergebniszeile aufrufen
möchten.
SQL:
mysql> CREATE PROCEDURE bubuProcedure(bubuParam varchar(32))
    -> BEGIN
    ->     SELECT LOWER(bubuParam);
    -> END;
    -> //
Query OK, 0 rows affected (0.03 sec)

Hier definieren wir die Stored Procedure die über die Ergebniszeilen der
SELECT id,value FROM BUBU; Abfrage drüber laufen soll und dann für jede Zeile die
bubuProcedure(value) mit dem Parameter value aufruft.


Eine eventuell vorhandene Procedure könnte man über:
SQL:
mysql> DROP PROCEDURE forEachRowInBubu;
    -> //
löschen.

SQL:
mysql> CREATE PROCEDURE forEachRowInBubu()
    -> BEGIN
    ->    DECLARE val varchar(32);
    ->    DECLARE finished INT DEFAULT 0;
    ->    DECLARE bubuCursor CURSOR FOR SELECT value FROM BUBU;
    ->    DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET finished = 1;
    ->
    ->    OPEN bubuCursor;
    ->    REPEAT
    ->       FETCH bubuCursor INTO val;
    ->       IF NOT finished THEN
    ->           CALL bubuProcedure(val);
    ->       END IF;
    ->    UNTIL finished END REPEAT;
    ->
    ->    CLOSE bubuCursor;
    -> END;
    -> //
Query OK, 0 rows affected (0.00 sec)

Btw. Hiermit definieren wir einen "Continue"-Handler für den Fall das
die Abfrage keine Ergebnisse liefert:
SQL:
   DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET finished = 1;
Error: 1329 SQLSTATE: 02000 (ER_SP_FETCH_NO_DATA)
Message: No data - zero rows fetched, selected, or processed

Siehe auch:
http://dev.mysql.com/doc/refman/5.0/en/error-messages-server.html

Unser Aufruf:
SQL:
mysql> call forEachRowInBubu();
    -> //
+------------------+
| LOWER(bubuParam) |
+------------------+
| a                |
+------------------+
1 row in set (0.00 sec)

+------------------+
| LOWER(bubuParam) |
+------------------+
| b                |
+------------------+
1 row in set (0.00 sec)

+------------------+
| LOWER(bubuParam) |
+------------------+
| c                |
+------------------+
1 row in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Gruß Tom
 
Zurück