CREATE FUNCTION - Beispiel

CREATE FUNCTION - Beispiel

am 10.05.2006 15:45:21 von francwalter

Hallo,
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