lunes, 31 de mayo de 2010

Control de flujo en procedimientos almacenados para MySQL 5

Seguimos con los procedimientos almacenados. Vamos a ver como llevar a cabo el control de flujo de nuestro procedimiento. También es interesante observar el uso de las variables dentro de los procedimientos. Si se declara una variable dentro de un procedimiento mediante el código :
declare miVar int;
Esta tendrá un ámbito local y cuando se acabe el procedimiento no podrá ser accedida. Una vez la variable es declarada, para cambiar su valor usaremos la sentencia SET de este modo :
SET miVar = 56 ;
Para poder acceder a una variable a la finalización de un procedimiento se tiene que usar parámetros de salida.
Vamos a ver unos ejemplos para comprobar lo sencillo que es :

IF THEN ELSE
delimiter //
CREATE procedure miProc(IN p1 int)     /* Parámetro de entrada */
    begin
        declare miVar int;        /* se declara variable local */
        SET miVar = p1 +1 ;        /* se establece la variable */
        IF miVar = 12 then
            INSERT INTO lista VALUES(55555);
        else
INSERT INTO lista VALUES(7665);
        end IF;
    end;
//
 
SWITCH
delimiter //
CREATE procedure miProc (IN p1 int)
    begin
        declare var int ;
        SET var = p1 +2 ;
        case var
            when 2 then INSERT INTO lista VALUES (66666);
            when 3 then INSERT INTO lista VALUES (4545665);
            else INSERT INTO lista VALUES (77777777);
        end case;
    end;
//
Creo que no hacen falta explicaciones.

COMPARACIÓN DE CADENAS
delimiter //
CREATE procedure compara(IN cadena varchar(25), IN cadena2 varchar(25))
    begin
        IF strcmp(cadena, cadena2) = 0 then
            SELECT "son iguales!";
        else
            SELECT "son diferentes!!";
        end IF;
    end;
//
La función strcmp devuelve 0 si las cadenas son iguales, si no devuelve 0 es que son diferentes.

USO DE WHILE
delimiter //
CREATE procedure p14()
    begin
        declare v int;
        SET v = 0;
        while v < 5 do
            INSERT INTO lista VALUES (v);
            SET v = v +1 ;
        end while;
    end;
//
Un while de toda la vida.

USO DEL REPEAT
delimiter //
CREATE procedure p15()
    begin
        declare v int;
        SET v = 20;
        repeat
            INSERT INTO lista VALUES(v);
            SET v = v + 1;
        until v >= 1
        end repeat;
    end;
//
El repeat es similar a un “do while” de toda la vida.

LOOP LABEL
delimiter //
CREATE procedure p16()
    begin
        declare v int;
        SET v = 0;
        loop_label : loop
            INSERT INTO lista VALUES (v);
            SET v = v + 1;
            IF v >= 5 then
            leave loop_label;
            end IF;
        end loop;
    end;
//
Este es otro tipo de loop, la verdad es que teniendo los anteriores no se me ocurre aplicación para usar este tipo de loop, pero es bueno saber que existe por si algún día te encuentras algún procedimiento muy antiguo que lo use. El código que haya entre loop_label : loop y end loop; se ejecutara hasta que se encuentre la sentencia leave loop_label; que hemos puesto en la condición, por lo tanto el loop se repetirá hasta que la variable v sea >= que 5.
El loop puede tomar cualquier nombre, es decir puede llamarse miLoop: loop, en cuyo caso se repetirá hasta que se ejecute la sentencia leave miLoop.

No hay comentarios:

Publicar un comentario