0

J'ai ce problème. J'utilise MySQL 5.7.10procédure MySQL: erreur dans l'extraction

J'ai défini ce PL (je sais, les messages de débogage dans le tableau TRAZAS sont un peu décousu):

DROP procedure IF EXISTS my_proc; 
DELIMITER $ 
CREATE PROCEDURE my_proc(... , OUT resultado INT, OUT mensaje TEXT) 
MODIFIES SQL DATA 
BEGIN 

    DECLARE sqlstate_code VARCHAR(10); 
    DECLARE message_text TEXT; 
    DECLARE mysql_errno INT; 

    DECLARE v_id_cliente VARCHAR(100) DEFAULT ''; 
    DECLARE v_device VARCHAR(100) DEFAULT ''; 
    DECLARE v_fecha_solicitud_crm DATETIME; 
    DECLARE v_id_ciclo VARCHAR(50); 
    DECLARE v_fecha_alta DATETIME; 
    DECLARE v_fecha_baja DATETIME; 
    DECLARE v_fecha_alta_promocion DATETIME; 


    DECLARE done INT DEFAULT FALSE; 


    DECLARE my_cursor CURSOR FOR 
    select id_cliente, device, fecha_solicitud_crm, id_ciclo, 
     min(FECHAS.fecha_inicio) AS FECHA_INICIO, max(FECHAS.fecha_fin) AS FECHA_FIN 
    from xxx 
    where 
     xxx 
    GROUP BY xxx 
    ORDER BY xxx; 


    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; 

    DECLARE EXIT HANDLER FOR SQLEXCEPTION 
     BEGIN 
     ROLLBACK; 
     SET resultado = 1; 

     START TRANSACTION;  
     INSERT INTO TRAZAS(TEXTO) VALUES (concat_ws(' - ', 'ERROR my_proc')); 
     COMMIT; 

     get diagnostics condition 1 message_text = MESSAGE_TEXT, sqlstate_code = RETURNED_SQLSTATE, mysql_errno = MYSQL_ERRNO; 
     SET mensaje = concat_ws(' - ', sqlstate_code, mysql_errno, message_text); 

     START TRANSACTION;  
     INSERT INTO TRAZAS(TEXTO) VALUES (concat_ws(' - ', 'ERROR my_proc', mensaje)); 
     COMMIT; 

    END; 

    SET resultado = 0; 
    SET mensaje = ''; 




    OPEN my_cursor; 

    /* Inicio del bucle */ 
    read_loop: LOOP 

     START TRANSACTION; 
     INSERT INTO TRAZAS(TEXTO) VALUES ('Inicio del loop. Antes del fetch'); 
     COMMIT; 


     FETCH my_cursor INTO v_id_cliente, v_device, v_fecha_solicitud_crm, v_id_ciclo, v_fecha_alta, v_fecha_baja; 
     IF done THEN 
      LEAVE read_loop; 
     END IF; 


     START TRANSACTION; 
     INSERT INTO TRAZAS(TEXTO) VALUES ('Despues del fetch'); 
     COMMIT; 


     /*****/ 
     START TRANSACTION; 
     INSERT INTO TRAZAS(TEXTO) VALUES (concat_ws(' - ', 'my_proc', 'v_id_cliente', v_id_cliente)); 
     INSERT INTO TRAZAS(TEXTO) VALUES (concat_ws(' - ', 'my_proc', 'v_device', v_device)); 
     INSERT INTO TRAZAS(TEXTO) VALUES (concat_ws(' - ', 'my_proc', 'v_fecha_solicitud_crm', v_fecha_solicitud_crm)); 
     INSERT INTO TRAZAS(TEXTO) VALUES (concat_ws(' - ', 'my_proc', 'v_fecha_alta', v_fecha_alta)); 
     INSERT INTO TRAZAS(TEXTO) VALUES (concat_ws(' - ', 'my_proc', 'v_fecha_baja', v_fecha_baja)); 
     COMMIT; 
     /*****/ 


     /* 
     Stuff with fetched data 
     */ 


     START TRANSACTION; 
     INSERT INTO TRAZAS(TEXTO) VALUES ('Siguiente iteracion del loop'); 
     COMMIT; 


    /* Fin del bucle */ 
    END LOOP read_loop; 

    CLOSE my_cursor; 

END$ 
DELIMITER ; 

Je suis sûr que le curseur sélectionner 6 lignes chercher. Je cours cette requête avec les mêmes données d'entrée PL dans HeidiSQL, et il récupère 6 lignes.

Aussi, je suis sûr que tout champ dans les 6 lignes est nul ou vide. Toutes les données sont remplies.

Malheureusement, le curseur ne renvoie qu'une seule ligne. Le comportement actuel est:

  • La première rangée est récupérée et traitée. Stuff est fait correctement. First row image
  • La deuxième ligne affiche uniquement la 'Inicio del loop. Antes del fetch 'message. Le deuxième message ('Despues del fetch') n'est pas affiché.

Second row image

  • Lors de la récupération résultat et un message de sortie avec select @resultado, @mensaje, il montre 0 et blanc.

Zero resultado

, il semble donc qu'il ya une erreur dans la phrase native FETCH, mais je ne peux pas obtenir toute information sur l'erreur avec « obtenir des diagnostics », HeidiSQL ne montre rien ..

Je suis bloqué sur ce point. Toute aide est très appréciée.

MISE À JOUR 1: Voici les données réelles récupérées par requête du curseur dans HeidiSQL:

INSERT INTO `myTable` (`id_cliente`, `device`, `fecha_solicitud_crm`, `id_ciclo`, `FECHA_INICIO`, `FECHA_FIN`) VALUES ('cod1-6a00-43b6-86ad-1234567e551', '606', '2017-08-17', 'C14', '2017-07-02 05:00:22', '2017-07-21 05:55:03'); 
INSERT INTO `myTable` (`id_cliente`, `device`, `fecha_solicitud_crm`, `id_ciclo`, `FECHA_INICIO`, `FECHA_FIN`) VALUES ('cod2-25d3-4282-a471-12345672806', '606', '2017-08-17', 'C14', '2017-02-19 07:03:47', '2017-07-19 07:55:02'); 
INSERT INTO `myTable` (`id_cliente`, `device`, `fecha_solicitud_crm`, `id_ciclo`, `FECHA_INICIO`, `FECHA_FIN`) VALUES ('cod3-c07d-42cd-9b23-12345671c2e', '606', '2017-08-17', 'C14', '2017-06-29 05:40:17', '2017-07-27 05:05:02'); 
INSERT INTO `myTable` (`id_cliente`, `device`, `fecha_solicitud_crm`, `id_ciclo`, `FECHA_INICIO`, `FECHA_FIN`) VALUES ('cod4-aafe-4442-a429-12345679312', '606', '2017-08-17', 'C14', '2017-06-24 05:22:24', '2017-07-19 07:55:02'); 
INSERT INTO `myTable` (`id_cliente`, `device`, `fecha_solicitud_crm`, `id_ciclo`, `FECHA_INICIO`, `FECHA_FIN`) VALUES ('cod5-0408-4656-84de-12345676ea5', '606', '2017-08-17', 'C14', '2017-04-04 08:17:27', '2017-07-23 05:05:01'); 
INSERT INTO `myTable` (`id_cliente`, `device`, `fecha_solicitud_crm`, `id_ciclo`, `FECHA_INICIO`, `FECHA_FIN`) VALUES ('cod6-b1e2-4192-8f33-12345676ac1', '606', '2017-08-17', 'C14', '2017-04-30 07:03:09', '2017-07-25 05:05:02'); 
+0

Avez-vous des exemples de données que vous pouvez publier? Cela faciliterait la détermination de la cause du problème. – wchiquito

+0

Je ne peux pas reproduire le problème, voir [db-fiddle] (https://www.db-fiddle.com/f/hPNn1rnwRaru9KaW7K2nKi/0). – wchiquito

+0

@wchiquito, merci beaucoup pour votre réponse. J'ai posté des données réelles récupérées par la requête (j'ai mis à jour le message principal). –

Répondre

0

Je n'ai pas fixé mon PL. Peut-être, il y a quelque chose dans le truc qui rend le curseur ne fonctionne pas, mais je ne peux pas le prouver.

Alors, enfin, j'ai en deux fente PLs

  • Sur la première PL, le curseur est déclaré et récupérer toutes les lignes.
  • Ensuite, le second PL est invoqué pour chaque ligne et fait tout le reste.

C'est rare, mais maintenant ça marche.

Espérons que ça aide. Merci.