CREATE FUNCTION - Beispiel
am 10.05.2006 15:45:21 von francwalterHallo,
auf vielfachen Wunsch hier ein einfaches Beispiel, wie man in MySQL 5.x
eine Funktion erstellt. Eine db mit den entsprechenden tabellen
vorausgesetzt, das wären zwei tabellen kunde, kunde_tmp:
CREATE TABLE `kunde` (
`KundenNr` int(11) NOT NULL auto_increment,
`PLZ` int(5) default NULL,
PRIMARY KEY (`KundenNr`)
);
CREATE TABLE `kunde_tmp` (
`kundennr` int(11) default NULL,
`plz` int(11) default NULL
);
und hier eine kommentierte beispiels-funktion, mit der man neue
datensätze fuer kunde anlegen kann,
das übergibt man beim funktionsaufruf, also zb
Select neue_kunden(100); gleichzeitig überträgt die funktion vorige
werte in kunde_tmp (nur zu ansichtszwecken)
In einem Skriptfenster im QueryBrowser diesen Text eingeben und auf
Execute klicken:
-- start function
DROP FUNCTION IF EXISTS neue_kunden;
-- delimiter ist normalerweise das ; (semikolon). damit innerhalb der
funktion die ausdruecke
-- nicht gleich ausgewertet werden wird der delimiter umbenannt und
nach ende der funkt.
-- wieder in ; zurueckbenannt. man kann statt $ auch irgendwas anderes
unbenutztes nehmen
DELIMITER $
CREATE FUNCTION neue_kunden (c int) RETURNS VARCHAR(50)
BEGIN
-- zaehlervariable deklarieren
DECLARE i int;
-- zweite zaehlervar.
DECLARE count_kunde_tmp int;
-- 2 variable, nehmen die ergebnisse des cursors auf
DECLARE kundennr int;
DECLARE plz int;
-- testweise variablen fuer beispiele s.u.
DECLARE auftragsnr int;
DECLARE datum date;
-- cursor deklarieren (vor loop block)
DECLARE cursor_kunde CURSOR FOR SELECT * from kunde;
-- zweiten cursor
DECLARE cursor_kunde_tmp CURSOR FOR SELECT COUNT(*) FROM kunde_tmp;
-- i initialisieren
SET i =3D 0;
SELECT AuftragsNr, Datum INTO auftragsnr, datum
FROM auftrag WHERE AuftragsNr =3D 1;
-- testweise dreimal das vorher aus dem select ermittelte datum
einfuegen
INSERT INTO auftrag (Datum) VALUES (datum), (datum), (datum);
-- oder auch:
-- INSERT INTO auftrag (KundenNr, Datum) VALUES (1, datum), (2,
datum);
-- loop schleife mit sprungmarke fuer den leave-befehl
-- oder: REPEAT ... UNTIL ist_wahr END REPEAT;
l1:LOOP
-- bedingung zum abbruch
IF i =3D c THEN LEAVE l1;
END IF;
-- zufallswerte in tabelle kunde einfuegen (KundenNr ist
auto_increment)
INSERT kunde (PLZ) VALUES (round(rand()* 100000,0));
-- i++
SET i =3D i + 1;
-- ende der schleife
END LOOP;
-- nur die menge an datensaetze die in kunde_tmp stehen durchlaufen
(count_kunde_tmp)
OPEN cursor_kunde_tmp;
FETCH cursor_kunde_tmp INTO count_kunde_tmp;
CLOSE cursor_kunde_tmp;
-- wenn eingabeparameter > anzahl in kunde_tmp dann gleichsetzen
IF count_kunde_tmp > c THEN SET count_kunde_tmp =3D c ;
END IF;
-- zur demonstration: die ALTEN werte aus kunde in eine temp. tabelle
(kunde_tmp) schreiben
-- zur funktionslaufzeit tabelle anlegen ist wohl nicht moeglich
-- cursor oeffnen
OPEN cursor_kunde;
-- i wieder zuruecksetzen
SET i =3D 0;
l2:LOOP
IF i =3D count_kunde_tmp THEN LEAVE l2;
END IF;
-- cursur einlesen in variablen
FETCH cursor_kunde INTO kundennr, plz;
-- in tabelle schreiben
INSERT INTO kunde_tmp VALUES(kundennr, plz);
-- count_kunde_tmp++
SET count_kunde_tmp =3D count_kunde_tmp + 1;
END LOOP;
-- cursor schliessen
CLOSE cursor_kunde;
-- rueckgabewert
RETURN 'ok';
END $
-- delimiter wieder normal
DELIMITER ;
-- end function