Por ejemplo de bucle en MySQL

104

En MySQL, tengo este procedimiento almacenado con un bucle For en él:

DELIMITER $$  
CREATE PROCEDURE ABC()

   BEGIN
      DECLARE a INT Default 0 ;
      simple_loop: LOOP
         SET a=a+1;
         select a;
         IF a=5 THEN
            LEAVE simple_loop;
         END IF;
   END LOOP simple_loop;
END $$

Siempre imprime 1. ¿Cuál es la sintaxis correcta para un bucle for de MySQL?

Chitresh
fuente
Esto crea nombres de procedimientos de tienda ABC. ¿Cuál es su formato de datos (uno que desea cargar) ?.
Zimbabao
No quiero ningún formato de datos, solo quiero imprimir un valor del 1 al 5
Chitresh
Acabo de probar este código y funcionó para mí. Tuve que agregar CALL ABC (); pero funcionó. También agregué DROP PROCEDURE ABC () al final porque solo lo estaba ejecutando como una prueba.
Alan Stewart

Respuestas:

143
drop table if exists foo;
create table foo
(
id int unsigned not null auto_increment primary key,
val smallint unsigned not null default 0
)
engine=innodb;

drop procedure if exists load_foo_test_data;

delimiter #
create procedure load_foo_test_data()
begin

declare v_max int unsigned default 1000;
declare v_counter int unsigned default 0;

  truncate table foo;
  start transaction;
  while v_counter < v_max do
    insert into foo (val) values ( floor(0 + (rand() * 65535)) );
    set v_counter=v_counter+1;
  end while;
  commit;
end #

delimiter ;

call load_foo_test_data();

select * from foo order by id;
Jon Negro
fuente
Gracias por tu respuesta, me ayudó. ¿Podría ser tan amable de ver también mi pregunta? Stackoverflow.com/questions/12259675/… . Mi pregunta principal es, ¿es necesario usar BEGIN...ENDy crear un procedimiento si solo quiero usar LOOP?
Verde
1
Si tiene problemas con los delimitadores, lea stackoverflow.com/a/10259528/632951
Pacerier
61

Ejemplo de sintaxis de bucle while en MySQL:

delimiter //

CREATE procedure yourdatabase.while_example()
wholeblock:BEGIN
  declare str VARCHAR(255) default '';
  declare x INT default 0;
  SET x = 1;

  WHILE x <= 5 DO
    SET str = CONCAT(str,x,',');
    SET x = x + 1;
  END WHILE;

  select str;
END//

Que imprime:

mysql> call while_example();
+------------+
| str        |
+------------+
| 1,2,3,4,5, |
+------------+

Ejemplo de sintaxis de ciclo REPEAT en MySQL:

delimiter //

CREATE procedure yourdb.repeat_loop_example()
wholeblock:BEGIN
  DECLARE x INT;
  DECLARE str VARCHAR(255);
  SET x = 5;
  SET str = '';

  REPEAT
    SET str = CONCAT(str,x,',');
    SET x = x - 1;
    UNTIL x <= 0
  END REPEAT;

  SELECT str;
END//

Que imprime:

mysql> call repeat_loop_example();
+------------+
| str        |
+------------+
| 5,4,3,2,1, |
+------------+

Ejemplo de sintaxis de bucle FOR en MySQL:

delimiter //

CREATE procedure yourdatabase.for_loop_example()
wholeblock:BEGIN
  DECLARE x INT;
  DECLARE str VARCHAR(255);
  SET x = -5;
  SET str = '';

  loop_label: LOOP
    IF x > 0 THEN
      LEAVE loop_label;
    END IF;
    SET str = CONCAT(str,x,',');
    SET x = x + 1;
    ITERATE loop_label;
  END LOOP;

  SELECT str;

END//

Que imprime:

mysql> call for_loop_example();
+-------------------+
| str               |
+-------------------+
| -5,-4,-3,-2,-1,0, |
+-------------------+
1 row in set (0.00 sec)

Haz el tutorial: http://www.mysqltutorial.org/stored-procedures-loop.aspx

Si te veo impulsando este tipo de construcciones de MySQL for-loop a producción, te dispararé con el lanzador de misiles de espuma. Puedes usar una llave de tubo para clavar un clavo, pero hacerlo te hace parecer tonto.

Eric Leschinski
fuente
2
Siguiendo el código que ha proporcionado, escribir declare str VARCHAR(255) default '';en la consola de MySQL (5.6) me da el mensaje de error Error 1064 (42000): ... for the right syntax to use near '' at line 3, que es tan claro como el barro (aunque supongo que no le gusta la cláusula DEFAULT).
Agi Hammerthief
Solía ​​funcionar en versiones anteriores. Creo que es el delimitador de final de línea para cambiar: use el comando delimiter //antes de ejecutar esto.
Eric Leschinski
¿Podemos usar Iterar y Dejar dentro mientras también? Estos actúan como continuar y romper. ¿Iterar funciona de manera similar a continuar en Java?
Deepak
13

Suponga que tiene una tabla con el nombre 'table1'. Contiene una columna 'col1' con tipo varchar. La consulta a la tabla de cajas se da a continuación

CREATE TABLE `table1` (
    `col1` VARCHAR(50) NULL DEFAULT NULL
)

Ahora, si desea insertar un número del 1 al 50 en esa tabla, utilice el siguiente procedimiento almacenado

DELIMITER $$  
CREATE PROCEDURE ABC()

   BEGIN
      DECLARE a INT Default 1 ;
      simple_loop: LOOP         
         insert into table1 values(a);
         SET a=a+1;
         IF a=51 THEN
            LEAVE simple_loop;
         END IF;
   END LOOP simple_loop;
END $$

Para llamar a ese procedimiento almacenado, use

CALL `ABC`()
Fathah Rehman P
fuente
1

Puede intercambiar esta variable local por una global, sería más fácil.

DROP PROCEDURE IF EXISTS ABC;
DELIMITER $$  
CREATE PROCEDURE ABC()

   BEGIN
      SET @a = 0;
      simple_loop: LOOP
         SET @a=@a+1;
         select @a;
         IF @a=5 THEN
            LEAVE simple_loop;
         END IF;
   END LOOP simple_loop;
END $$
Bruno Henrique
fuente