Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

En un procedure: seleccionar un "elemento" (usando algun tipo de loop) de una columna

Estas en el tema de En un procedure: seleccionar un "elemento" (usando algun tipo de loop) de una columna en el foro de Mysql en Foros del Web. Hola!! Me gustaría crear un procedure que de alguna manera me fuera recorriendo cara "posición" de una lista (una columna) (pasada mediante argumento tal que ...
  #1 (permalink)  
Antiguo 02/03/2010, 09:00
 
Fecha de Ingreso: abril-2009
Mensajes: 13
Antigüedad: 15 años, 7 meses
Puntos: 0
En un procedure: seleccionar un "elemento" (usando algun tipo de loop) de una columna

Hola!!

Me gustaría crear un procedure que de alguna manera me fuera recorriendo cara "posición" de una lista (una columna) (pasada mediante argumento tal que así:

Código MySQL:
Ver original
  1. CALL procedurito( ('hola', 'hola2', 'hola3') );

He estado mirando la documentación de mysql sobre loops, whiles y tal pero ninguna me habla de como "seleccionar" un elemento de una lista (una columna) pasada como argumento.

He pensado cosas como esto:

Código MySQL:
Ver original
  1. SELECT * FROM  ('hola', 'hola2', 'hola3') LIMIT 0, 1
(y me seleccionaria el primer elemento).

Sabéis de algún truco para seleccionar un elemento en concreto de una columna pasada por argumento a un procedure de MySQL?

Un saludo y gracias.
  #2 (permalink)  
Antiguo 02/03/2010, 09:15
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: En un procedure: seleccionar un "elemento" (usando algun tipo de loop) de

Tienes que analizar el tema CURSORES en MySQL.
Eso es lo que tienes que usar.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 02/03/2010, 09:45
 
Fecha de Ingreso: abril-2009
Mensajes: 13
Antigüedad: 15 años, 7 meses
Puntos: 0
Respuesta: En un procedure: seleccionar un "elemento" (usando algun tipo de loop) de

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Tienes que analizar el tema [URL="http://dev.mysql.com/doc/refman/5.0/es/cursors.html"]CURSORES en MySQL.[/URL]
Eso es lo que tienes que usar.
Hola! gracias por responder. He estado informandome un poco y "esto" es lo que he obtenido.

Parece ser que sería fácil hacerlo si haces la consulta dentro del procedure. Pero no si tu le pasas la "lista" con la que quieres trabajar mediante argumento. He estado este código basandome en el que hay de ejemplo en: http://dev.mysql.com/doc/refman/5.1/en/cursors.html

A ver si tienes mejor idea que yo... :(

Código MySQL:
Ver original
  1. CREATE PROCEDURE curdemo(IN tags VARCHAR(100))
  2. -- recibimos la "lista" ('hola1', 'hola2', 'hola3') por ejemplo.
  3.  
  4. DECLARE alltags CURSOR FOR tags;
  5. -- declaramos el cursor
  6. DECLARE tag VARCHAR(100);
  7. DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
  8.  
  9.   OPEN alltags;
  10. -- Abrimos cursor
  11.  
  12.     FETCH alltags INTO tag; -- para cada elemento del cursor...
  13.     IF NOT done THEN
  14.         SELECT tag; --lo imprimimos por pantalla (por ejemplo)
  15.     END IF;
  16.   UNTIL done END REPEAT;
  17.  
  18.   CLOSE alltags;
  19. -- Cerramos cursor
  20. END//

Un saludo!

EDITO:

Código sin comentarios:
Código MySQL:
Ver original
  1. CREATE PROCEDURE curdemo(IN tags VARCHAR(100))
  2.  
  3. DECLARE alltags CURSOR FOR tags;
  4. DECLARE tag VARCHAR(100);
  5. DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
  6.  
  7.   OPEN alltags;
  8.  
  9.     FETCH alltags INTO tag;
  10.     IF NOT done THEN
  11.         SELECT tag;
  12.     END IF;
  13.   UNTIL done END REPEAT;
  14.  
  15.   CLOSE alltags;
  16. END//

Última edición por Bloodsucker; 02/03/2010 a las 12:15
  #4 (permalink)  
Antiguo 02/03/2010, 14:37
 
Fecha de Ingreso: abril-2009
Mensajes: 13
Antigüedad: 15 años, 7 meses
Puntos: 0
Respuesta: En un procedure: seleccionar un "elemento" (usando algun tipo de loop) de

¡Hola!

He encontrado justo lo que necesitaba!!! Casualmente mirando la docu de mysql he encontrado un comentario de una persona fantástica con una sugerencia de código de justo lo que yo necesitoooooo !!!!!

Aquí el código para que quien quiera pueda usarlo:

Código MySQL:
Ver original
  1. select substring_index(substring_index('a,b,c', ',',@r:=@r+1),',',-1) zxz
  2. from (select @r:=0) x,
  3. (select 'x' xx union select 'v' xx union select 'z' xx) z;

+------+
| zxz |
+------+
| a |
| b |
| c |
+------+

3 rows in set (0.00 sec)

Ahora YA puedo meter ese resultado en un cursor!! :P:P


EDITO:

El anterior era un fraude... al menos no he sabido usarlo bien xD. El caso es que buscando más he conseguido una todavía más simple:
Código MySQL:
Ver original
  1. SELECT SUBSTRING_INDEX( SUBSTRING_INDEX( 'a|b|c|d|e|f|g|h', '|', indice), '|', -1 )
Donde indice es la "posición" de la palabra que quieres extraer. Por lo que si ponemos: indice = 1 obtendremos 'a'; ó si ponemos indice = 3 obtendremos 'c'. Ahora ya puedo trabajar con lo que quería!! :D

E aquí mi procedure:

Código MySQL:
Ver original
  1. CREATE PROCEDURE curdemo(IN tags VARCHAR(100), IN tam INT)
  2.     DECLARE indice INT;
  3.     DECLARE word VARCHAR(100);
  4.    
  5.     SET indice = tam;
  6.     WHILE indice > 0 DO
  7.         SELECT SUBSTRING_INDEX( SUBSTRING_INDEX( tags, ',', indice), ',', -1 ) INTO word;
  8.         -- Hacemos los que necesitamos; en la variable word tenemos la palabra que buscamos
  9.         SET indice = indice - 1;
  10.     END WHILE;
  11. END//

EDITO:

Mucho mejor!!!!! :P:
Código MySQL:
Ver original
  1. CREATE PROCEDURE curdemo(IN tags VARCHAR(100))
  2.     DECLARE indice INT;
  3.     DECLARE tam INT;
  4.     DECLARE word VARCHAR(100);
  5.     DECLARE aux VARCHAR(100) DEFAULT tags;
  6.     declare delim VARCHAR(1) DEFAULT ',';
  7.    
  8.     SET tam = (length(aux)-length(REPLACE(aux, delim, '')))/length(delim) + 1 ;
  9.    
  10.     SET indice = tam;
  11.     WHILE indice > 0 DO
  12.         SET word = SUBSTRING_INDEX( SUBSTRING_INDEX( tags, delim, indice), delim, -1 );
  13.         -- Hacemos los que necesitamos; en la variable word tenemos la palabra que buscamos
  14.         SET indice = indice - 1;
  15.     END WHILE;
  16.  
  17. END//

De esta forma, simplemente con pasarle el string, ni si quiera el tamaño, ya te lo trabaja :P

Última edición por Bloodsucker; 02/03/2010 a las 16:13

Etiquetas: columna, lista, loop, procedures
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 08:20.