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.
Me llamo David Noguera, tengo 23 años y soy Desarrollador/Administrador web.
Puedes encontrar algo más de información en la página
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.
15 de Octubre del 2008 a las 1:40 pm
Muy util, gracias…
28 de Enero del 2009 a las 7:58 pm
Hola me parece excelente este post, la información en el me fué muy útil por ser tan clara y concisa…
Quisiera agregar algo más…. tuve ciertos problemas intentando asignar el resultado de una consulta a una variable dentro de un procedimiento almacenado en mysql.
Y después de mucho buscar y buscar.. me encontré con esta instrucción que puede ser muy útil para otros..
select count(*) into @num from vendedor where idvendedor=id;
En ella se asigna el valor del count en la variable @num..
De nuevo gracias por este post…
6 de Marzo del 2009 a las 11:08 am
muy claro! Gracias men!!
4 de Mayo del 2009 a las 3:42 am
Hola, una consulta asi como en SQLServer de M$crosoft se llama Transact-SQL en MySql la sintaxis de SQL como se llamaria, ¿ De la misma forma?
13 de Mayo del 2009 a las 10:53 pm
David, gracias en verdad que sencillo explicas las cosas graciasss
2 de Junio del 2009 a las 9:43 am
Amigo una consulta!
kiero hacer mesclar varias listas en un procedure y que me returne una sola…
como hago??? un ejemplito taria bueno
25 de Junio del 2009 a las 2:23 pm
Hola amigo, queria pedir un favor y es si puedes explicarme como utilizar commit y rollback en Mysql en un ejemplo sencillo. Gracias y por cierto, muy buen blog.
31 de Julio del 2009 a las 1:05 pm
hola, buena explicacion–> tengo una duda, donde se guarda todos estos “procedimientos almacenados”?, como los puedos ver? porque imaginense que tengas mas de 20 SP, y ps no creo que me acuerde de todas ellas al momento de llamarlas, utilice -SHOW PROCEDURE STATUS LIKE ‘%intro%’- no hay otra manera de ver todos? sin necesidad de poner el like?–> gracias por su ayuda
17 de Diciembre del 2009 a las 8:50 am
Buen tutorial!.
Gracias.