Webstack
Bejelentkezés

Elfelejtetted a jelszavad?

Nem vagy még tag? Kattints ide és regisztrálj most!

MySQL tárolt eljárások - vezérlési szerkezetek - 2.rész

mySQL | tomizej  | 2012-10-02 11:06:48

Elágazások

Elágazásokat akkor alkalmazunk, amikor valamilyen feltétel esetében bizonyos utasításokat kell elvégeztetnünk, ha a feltétel nem következik be, akkor meg más utasításokat kell elvégeztetnünk, vagy pedig semmilyen utasítást sem kell végeztetnünk.
Az elágazások közül a mysql támogatja az IF és a CASE szerkezetet.

IF

Tárolt eljárásokban az elágazásoknak, hasonló a működésük, mint más nyelvekben, csak a szintaktika más. Elágazást az alábbi módokon hozhatunk létre.

Egyirányú (IF) elágazás:

IF kifejezes THEN 
utasitasok;
ENDIF ;

Kétárnyú (IF-ELSE) elágazás:

IF kifejezes THEN 
utasitasok;
ELSE
utasitasok2;
ENDIF ;

Többirányú (IF – ELSEIF – ELSE) elágazás:

IF kifejezes THEN 
utasitasok;
ELSE IF kifejezes2 THEN
utasitasok2;
ELSE
utasitasok3;
ENDIF ;

Az elágazásban lévő kódblokk csak akkor fut le, ha a kifejezés igaz, mint minden más programozási nyelvben. Egy elágazáson belül lehetnek további kondíciók, ELSEIF el további kifejezést adtatunk meg, ha ez első kifejezés nem igaz, a vezérlés továbblép a az ELSIF ágra, Ha az ELSEIF ág kifejezése sem igaz, lefut az ELSE ágban lévő kódblokk. IF és ELSIF után meg kell adni a THEN kulcsszót. Az alábbi összetettebb példában az összes lehetőség kombinációja jelen van.

DELIMITER $$
CREATE PROCEDURE `ageCheck` (IN id INT)
BEGIN
    DECLARE uAge INT;
    SELECT age from user INTO uAge
	WHERE userid = id;
    IF uAge >= 18 THEN
        SELECT  CONCAT(’A fehlasználó nagykorú! ’, uAge, ’éves’);
	ELSEIF uAge < 12 AND uAge > 5 THEN
		SELECT ’A felhasználó 12 éven aluli!’;
	ELSE
		SELECT ’A felhasználó 5 éven aluli gyermek gyerek!’;
    END IF;
END $$

Az eljárás kiírja, hogy a megadott felhasználó (akit az id paraméter azonosít) kora milyen besorolásba tartozik. 18, 12, 5 év közötti tartományok közt különböző szövegeket jelenít meg.

CASE

A CASE nagyszerű módszer a többirányú elágazások megvalósítására. A CASE elágazásokat ki lehet váltani többirányú IF-ELSEIF-ELSE ágakkal, de a CASE-el átláthatóbb kódot tudunk írni. Az alábbi tárolt eljárás egy tanulónak ad jegyet 1-5ig lehet megadni az értéket, ennek megfelelően a jegy értékelését is tárolja (elégtelen, közepes, jeles…stb.). A CASE alapértelmezett ága, ha egyik ág sem futna le az ELSE. Ekkor kiírja, hogy nincs ilyen jegy.

DELIMITER //
CREATE PROCEDURE `insertMark` (IN mark INT)
BEGIN
    CASE mark
        WHEN 1 THEN
            INSERT INTO student_grade (jegy, jegy_nev) VALUES (mark, ’elégtelen’);
        WHEN 2 THEN
            INSERT INTO student_grade (jegy, jegy_nev) VALUES (mark, ’elégséges’);
        WHEN 3 THEN
	INSERT INTO student_grade (jegy, jegy_nev) VALUES (mark, ’közepes’);
       WHEN 4 THEn
	INSERT INTO student_grade (jegy, jegy_nev) VALUES (mark, ’jó’);
       WHEN 5 THEN
INSERT INTO student_grade (jegy, jegy_nev) VALUES (mark, ’jeles’);
        ELSE
            SELECT „Nincs ilyen jegy”;
    END CASE;
END //

Ugyanezt az elágazást egy másik módszerrel is megírhatjuk, a CASE, WHEN ágaiba is írhatjuk a kifejezést. Ez a módszer eltér más nyelvektől, de így gyakorlatilag különböző kifejezéseket is írhatunk az eltérő ágakba.

DELIMITER //
CREATE PROCEDURE `insertMark` (IN mark INT)
BEGIN
    CASE
        WHEN mark = 1 THEN
            INSERT INTO student_grade (jegy, jegy_nev) VALUES (mark, ’elégtelen’);
        WHEN mark = 2 THEN
            INSERT INTO student_grade (jegy, jegy_nev) VALUES (mark, ’elégséges’);
        WHEN mark = 3 THEN
	INSERT INTO student_grade (jegy, jegy_nev) VALUES (mark, ’közepes’);
       WHEN mark = 4 THEn
	INSERT INTO student_grade (jegy, jegy_nev) VALUES (mark, ’jó’);
       WHEN mark = 5 THEN
INSERT INTO student_grade (jegy, jegy_nev) VALUES (mark, ’jeles’);
        ELSE
            SELECT „Nincs ilyen jegy”;
    END CASE;
END //

Ciklusok

Tárolt eljárásokban 3 fajta ciklus létezik. WHILE (elől tesztelős ciklus), REPAT (hátul tesztelős ciklus), LOOP.

While ciklus

A while ciklus egy úgynevezett elöl tesztelő ciklus. Ez azt jelenti, hogy a while kulcsszó után van egy logikai kifejezés. A ciklusmagot mindaddig végrehajtja, amíg a kifejezés igaz. Ha a kifejezés kezdetben hamis, egyáltalán nem hajtja végre a magot.
Az alábbi példában egy összetettebb tárolt eljárást láthatunk a While elől tesztelős ciklusra. Az eljárással x darab véletlenszerű felhasználót generálhatunk. Ha egy új rendszert tesztelni akarunk terhelt környezetben, hasonló eljárásokkal könnyedén feltölthetjük az adatbázist véletlen adatokkal.

CREATE PROCEDURE create_random_users (IN iteration INT)
BEGIN
DECLARE i INT DEFAULT 1;
DECLARE v_userName, v_pw VARCHAR(50);
DECLARE v_age INT;
DECLARE v_active TINYINT;
/*Feltoltjuk a kerdesek tablat*/
WHILE i <= iteration DO
   SET v_uname = CONCAT('test_name', iteration);
   SET v_pw = CONCAT('test_pw', iteration);
   SET v_email= CONCAT('test@test_', iteration, '.hu');
/* Életkor 1-60 random értékkel */
SET v_age = FLOOR(1 + RAND() * 60);
   INSERT INTO user (username, password, email, age)
     VALUES (v_userName, v_pw, v_email, v_age);
   SET i = i + 1;
 END WHILE;
END$$

REPEAT Ciklus

A REPEAT hátul tesztelős ciklus esetében egyszer legalább végrehajtja a program a ciklus magot. Csak az első végrehajtás után vizsgálja meg, hogy teljesül-e a feltétel vagy sem.

REPEAT szintaktika:

REPEAT
utasítások;
UNTIL kifejezés
END REPEAT

Az alábbi példában a tárolt eljárás 1től a megadott számig vesszővel elválasztva kiírja a sorozatot.

DELIMITER $$
CREATE PROCEDURE RepeatLoopProc(IN num INT)
      BEGIN
              DECLARE i INT;
              DECLARE str  VARCHAR(255) DEFAULT ’’;
              SET i = 1;
              REPEAT
                SET  str = CONCAT(str,i,',');
                     SET  i = i + 1; 
              UNTIL i  > num
              END REPEAT;
              SELECT str;
      END$$
DELIMITER ;

Szerző: tomizej

címkék
Címkék: tutorial, mySQL, php,

Hozzászólások

Hozzászóláshoz be kell jelentkezni!

Keress minket Facebookon
Ajánlások