Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   MySQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=21)
-   -   Stored Procedure (https://www.clubdelphi.com/foros/showthread.php?t=94063)

shoulder 13-07-2019 03:34:35

Stored Procedure
 
Hola estoy con un motor mysql 5.6 no encuentro forma de visualizar datos con un loop no se que estoy haciendo mail, no me da error al crear el proceso y la tabla y el campo estan bien y hay 400 registros. Gracias (dejo el ejemplo).


Cita:



DELIMITER $$
DROP PROCEDURE IF EXISTS `empresa`.`usuarios` $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `usuarios`(
OUT mails varchar(400))
BEGIN
DECLARE no_more_records INTEGER DEFAULT 0;
DECLARE v_email varchar(100) DEFAULT "";
DECLARE cur_EventRanks CURSOR FOR
select mail from usuario;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET no_more_records=1;
set no_more_records = 0;
open cur_EventRanks;
cur_Loop: LOOP
FETCH cur_EventRanks INTO
v_email;
if no_more_records = 1 then
leave cur_Loop;
end if;
SET mails = CONCAT(v_email,";",mails);
END LOOP cur_Loop;
close cur_EventRanks;
END $$
DELIMITER ;
--//La llamada la hago como
call usuarios(@mails)
select @mails




nada me trae en blanco la variable- probe una stored procedure sin loop y funciona e viene la lista de los 400 registros.









Casimiro Notevi 13-07-2019 09:38:23

Amigo shoulder, en este mensaje has actuado como un novato, un título no descriptivo, una explicación nada clara, unas etiquetas de cita para código... :eek:
En fín, a veces pasa :D

mRoman 13-07-2019 17:14:27

Cita:

Empezado por Casimiro Notevi (Mensaje 532764)
Amigo shoulder, en este mensaje has actuado como un novato, un título no descriptivo, una explicación nada clara, unas etiquetas de cita para código... :eek:
En fín, a veces pasa :D

Asi de estresado ha de estar !!!...:D jajaja

orodriguezca 13-07-2019 18:48:16

No se mucho de SP en mysql, pero entiendo que ese procedimiento solo devuelve la variable de salida mails y no un conjunto de resultados.

Por otra parte, si en la tabla usuarios hay 400 registros, no veo forma de que esos 400 emails concatenados puedan almacenarse en la variable de salida mails sin que cause un error de truncamiento de datos.

Casimiro Notevi 13-07-2019 20:45:24

Cita:

Empezado por mRoman (Mensaje 532765)
Asi de estresado ha de estar !!!...:D jajaja

Eso mismo pensé :)

shoulder 15-07-2019 01:08:21

Stores Procedure no trae datos
 
Hola primero de todo perdonnn, si estoy estresado, ustedes siempre me ayudaron y lo reconosco..., me faltaba el where, yo quiere hacer que entre en el loop el select y me concatene tres datos que son mails. el tema que no logro, aunque sacando el where (me olvide de escribirlo en el stored) entre dentro del loop, me devuelve la cadena vacia. Busque por internet copie igual a algunos ejemplos pero me devuelve esto : @mails y nada mas sin ningun contenido. Por eso ya por perdido y con stress le habia sacado el where.


El ejemplo seria si tengo un campo oficina que me traiga nada mas los mails de codigo del personal que trabaja en dicha oficina para probar como ejemplo serian tres mails nada mas. Pero nada me aparece como retorno @mails. Si me funciona ya lo aplicaria a otros temas. Tome un select simple como ejemplo.

Gracias.

bucanero 15-07-2019 12:13:42

el problema puede venir de que no tienes inicializada la variable de salida del procedimiento, por lo que si el valor es NULL, todo lo que concatenes automáticamente sera NULL

De esta forma a mi me funciona, solo he añadido la linea en rojo:

Código SQL [-]
CREATE PROCEDURE `usuarios`(OUT mails varchar(400))
BEGIN
  DECLARE no_more_records INTEGER DEFAULT 0;
  DECLARE v_email VARCHAR(100) DEFAULT "";

  DECLARE cur_EventRanks CURSOR FOR
  SELECT mail FROM usuario;

  DECLARE CONTINUE HANDLER 
      FOR NOT FOUND SET no_more_records=1;

  SET mails=''; -- inicializar la variable de salida
  SET no_more_records = 0;

  OPEN cur_EventRanks;

  cur_Loop:
   LOOP
      FETCH cur_EventRanks   INTO v_email;

      IF no_more_records = 1
      THEN
         LEAVE cur_Loop;
      END IF;

      SET mails = CONCAT(v_email, ";", mails);
   END LOOP cur_Loop;

  CLOSE cur_EventRanks;
END

shoulder 16-07-2019 21:56:21

Store Procedure no trae datos
 
Gracias, se fue el stress... me funciono como me habias indicado pero tambien agregando la linea select mails. Mil Gracias.
Cita:


CREATE PROCEDURE `usuarios`(OUT mails varchar(400))
BEGIN
DECLARE no_more_records INTEGER DEFAULT 0;
DECLARE v_email VARCHAR(100) DEFAULT "";

DECLARE cur_EventRanks CURSOR FOR
SELECT mail FROM usuario;

DECLARE CONTINUE HANDLER
FOR NOT FOUND SET no_more_records=1;

SET mails=''; -- inicializar la variable de salida
SET no_more_records = 0;

OPEN cur_EventRanks;

cur_Loop:
LOOP
FETCH cur_EventRanks INTO v_email;

IF no_more_records = 1
THEN
LEAVE cur_Loop;
END IF;

SET mails = CONCAT(v_email, ";", mails);
END LOOP cur_Loop;
select mails
CLOSE cur_EventRanks;
END






La franja horaria es GMT +2. Ahora son las 11:18:29.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi