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.
Con esto ya podemos empezar a crear procedimientos medianamente complejos y útiles.
Comentarios
Trackbacks
- Procedimientos almacenados con MySQL 5 | nosoloCodigo
- Crear handlers para manejar errores en MySQL 5 | nosoloCodigo
- Cómo crear funciones en MySQL | nosoloCodigo
2 de Junio del 2008 a las 10:28 pm
Hola David, pues bien me gustan mucho los post de tu blog, se nota que te has metido fuerte en este tema, la verdad aunque llevo un muy buen tiempo trabajando en desarrollo web no habia visto explicaciones tan claras sobre temas tan utiles como estos.. incluso yo que llevo casi 8 años haciendo aplicaiones web resolvi unas dudas:) gracias..
Pero tengo un pequeño comentario, en este post en el ejemplo del (repeat - until) creo que hay un defecto que crearia un ciclo infinito, yo se que muchos podemos reconocerlo pero mejor corrigelo asi los nuevos en este tema no cometeran el mismo error.
De nuevo gracias y suerte.
2 de Junio del 2008 a las 10:36 pm
perdon creo que me equivoque… el ciclo funciona bien y se ejecuta una sola vez… lo que sucede es que lo asocie justamente con el do while… y si hay una acotacion:
el do while, traduce: hacer mientras
el repeat until, traduce: repetir hasta que
son iguales en que por lo menos sucede una iteracion o ejecucion del ciclo, pero, el do while se ejecuta mientras la condicion del while sea cierta y se termina cuando no se cumpla, al contrario el repeat until, se ejecuta hasta que la condicion sea vuelva cierta, mientras sea falsa el seguira iterando.
perdon por la aclaracion pero me gusta poder afinar los detalles y sobretodo.. que las proximas personas que lean vean estas pequeñas diferencia antes de tomar decisiones.
2 de Junio del 2008 a las 11:23 pm
Muchas gracias por el apunte!
:;
29 de Agosto del 2008 a las 8:31 am
Hola, muchas gracias por los tutoriales están excelentes y bastante claros…
Ne nueva cuenta muchas gracias.